メディアファイルの扱い 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(多重化)メディアデータ