メディアファイルの扱い 2
AVPlayerItem

まずは、url から AVAsset オブジェクトを作り、playerItemWithAsset で AVPlayerItem オブジェクトを作る。

asset = AVAsset.assetWithURL(url)

playerItem = AVPlayerItem.playerItemWithAsset(asset)

もしくは、メディアファイルの url を指定して、playerItemWithURL(url) でファイルから直接 AVPlayerItem を作ることもできる。

playerItem = AVPlayerItem.playerItemWithURL(url)

AVPlayer の playerWithPlayerItem(playerItem) で、AVPlayer オブジェクトを作ることができる。

player = AVPlayer.playerWithPlayerItem(playerItem)

AVPlayerItem で得られる情報には次のような物がある。

playerItem.asset

playerItem.duration

playerItem.presentationSize

playerItem.status

asset - 元となっている AVAsset オブジェクトが得られる。

duration - 関連づけられたメディアファイルの長さが CMTime で得られる。

presentationSize - 標準の表示サイズが CGSize で得られる。音声ファイルなどで映像データがない場合は、width = 0.0, height = 0.0 が返る。

status - AVPlayerItem オブジェクトの状態が得られる。AVPlayerItemStatusUnknown (0)、AVPlayerItemStatusReadyToPlay (1)、AVPlayerItemStatusFailed (2)。0 がわからない状態、1 が再生できる状態、2 が再生できない状態。

AVPlayer オブジェクトを作って、AVPlayerView に結びつけたり、そうでないにしても、AVPlayer オブジェクトとしてメディアを再生させている時に使えるメソッドには次のような物がある。

playerItem.currentTime

playerItem.seekToTime(time)

playerItem.seekToTime(time,completionHandler:Proc.new{|finished|})

playerItem.seekToTime(time,toleranceBefore:toleranceBefore,toleranceAfter:toleranceAfter)

playerItem.seekToTime(time,toleranceBefore:toleranceBefore,toleranceAfter:toleranceAfter,completionHandler:Proc.new{|finished|})

playerItem.stepByCount(stepCount)

currentTime - 現在の再生位置の時間が CMTime で返る。位置が 0 の時は、timecode が 1 になるので注意。

seekToTime - CMTime で時間を指定してその位置に再生位置を移動する。ただし、time のみを指定すると、効率が最優先されるので、実際に指定した時間位置と異なることもあるので注意。completionHander を加えると、移動後の処理を指定できる。toleranceBefore と toleranceAfter を加えると、CMTime で、どれくらいのずれを許容するかを指定できる。tolerance の値に KCMTimeZero を指定すると、正確な位置に移動する。ただし、ファイルが大きい場合などにはその分時間がかかるかもしれない(小さなファイルではあまり影響はないみたい)。

stepByCount - stepCount に integer でフレーム数を指定して、前後のフレームに移動させることができる。マイナスの値を入れると指定フレーム数戻る。