メディアファイルの扱い 1
AVAsset
AVFoundation できることはいろいろあるけど、使ってみたのから少しずつメモっていく。
まずは、AVAsset について、少しだけ。ファイルの url を指定して、メディアファイルから AVAsset オブジェクトを作る。
asset = AVAsset.assetWithURL(url)
この AVAsset オブジェクトは、要はメディアファイルの中身。
duration で、メディアの長さがわかる。これは、QTMovie で duration を使って QTTime で長さが返ってくるのと同じ感じ。
duration = asset.duration
これで返ってくるのは CMTime。これに関しては別項目で QTTime と対比させてメモするつもり。
tracks で、含まれている track が AVAssetTrack オブジェクトとして返ってくる。QTMovie で tracks だと QTTrack オブジェクトが返るのと同じ感じ。
tracks = asset.tracks
この AVAssetTrack オブジェクトからは、それぞれのトラックの情報が得られる。いくつか反応があった物を書き留めておく。
track.trackID
track.mediaType
track.totalSampleDataLength
track.timeRange
track.naturalTimeScale
track.estimatedDataRate
track.languageCode
track.naturalSize
track.preferredTransform
track.preferredVolume
track.nominalFrameRate
track.segments[0].timeMapping
trackID - それぞれのトラックに割り振られた ID が得られる。
mediaType - メディアタイプが得られる。vide ビデオトラック、soun サウンドトラック、subp 字幕トラック、text テキストトラック、など。このうち、subp は AVFoundation で扱えるかどうかよくわからない。text トラックには、チャプター情報なども含まれるらしいが、これもまだよくわからない。
totalSampleDataLength - データの大きさが返ってくる。NSData の length で返ってくるのと同じ長さなんだろう。
timeRange - CMTimeRange で start と duration の情報 CMTime (value と timescale) が得られる。
naturalTimeScale - トラックの timescale が得られる。必ずしも asset の timescale とは一致しないし、トラックごとに異なることもある。
estimatedDataRate - トラックのデータの推定データレートが得られる。
languageCode - トラックの言語コードが ISO 639-2/T language code で得られる。詳しくは、こちらのページを参照。"und" となっている場合は、おそらく undefined で、映像データなどの場合に、言語コードが割り当てられていない(関係ない)と表示されるのではないかと思う。
naturalSize - 元々の表示サイズが CGSize (width,height) として返ってくる。映像データがない場合は、width = 0.0, height = 0.0 が返ってくる。
preferredTransform - 映像データの標準の変形データが返ってくる。おそらく、3D で rotate させた情報ではないかと思われる。perspective というか、そんな感じ。
preferredVolume - 音声データの標準(?)音量の値が返ってくる。
nominalFrameRate - トラックのフレームレートが返ってくる。
segments - AVAssetTrackSegment オブジェクトが Array で返ってきて、timeMapping で、メディアファイルとトラックの時間の情報が CMTimeMapping として得られる。CMTimeMapping には、source と target の duration の情報が入っている。ここで、source はトラックのメディアの duration で、target はそれを含むファイルもしくはトラック自体の duration ではないかと思われる(確証はない)。一致していれば問題はないが、ずれている場合は、source.duration/target.duration の割合で調節されてトラックに収まっているということになる。例えば、映像と音声で長さが違う場合、どちらかに合わせて調整されている(おそらく音声に合わせて映像の長さが調整される)場合は、source と target が異なる。
tracksWithMediaType(mediaType) でメディアタイプを指定すると、そのメディアタイプのトラックを取り出せる。
asset.tracksWithMediaType(mediaType)
対応しているメディアタイプは以下の通り。
AVMediaTypeVideo ビデオ
AVMediaTypeAudio オーディオ
AVMediaTypeText テキスト(チャプターを含む?)
AVMediaTypeClosedCaption クローズドキャプション
AVMediaTypeSubtitle 字幕
AVMediaTypeTimecode タイムコード
AVMediaTypeTimedMetadata 時間情報を伴った(?)メタデータ
AVMediaTypeMetadata メタデータ
AVMediaTypeMuxed muxed(多重化)メディアデータ