メディアファイルの扱い 3
AVPlayer

AVPlayer オブジェクトを使って、メディアファイルを再生したりできる。

AVPlayer オブジェクトは playerWithURL(url) で、メディアファイルの url を指定してファイルから直接読み込む方法と、playerWithPlayerItem(playerItem) で AVPlayerItem オブジェクトから作る方法がある。これでできた AVPlayer オブジェクトを AVPlayerView の player に指定すると、AVPlayerView に メディアファイルの中身が表示される。

player = AVPlayer.playerWithURL(url)

player = AVPlayer.playerWithPlayerItem(playerItem)

@playerView.player = player

基本的にはメディアの再生に関することを扱うクラスなので、再生に関するメソッドが多いが、まずは、情報を得る物から。

player.actionAtItemEnd

player.closedCaptionDisplayEnabled

player.currentItem

player.status

actionAtItemEnd - 再生が終わったときの処理。AVPlayerActionAtItemEndAdvance (0)、AVPlayerActionAtItemEndPause (1)、AVPlayerActionAtItemEndNone (2)。1 は次のアイテムがある場合に次に移る。2 は停止する。3 は何もしない。

closedCaptionDisplayEnabled - 使えないらしい(エラーが返ってきた)。

currentItem - 関連づけられた AVPlayerItem オブジェクトが返る。

status - プレーヤーの状態が返る。AVPlayerStatusUnknown (0)、AVPlayerStatusReadyToPlay (1)、AVPlayerStatusFailed (2)。0 がわからない状態、1 が再生できる状態、2 が再生できない状態。AVPlayerItem の物と同じっぽい。

再生に関しては、QTMovie と同じようなことができる。

player.play

player.pause

player.muted

player.rate

player.rate = 1.0

player.volume

player.volume = 1.0

play - 再生の開始。

pause - 再生の停止。

muted - 今のところ使えないっぽい(エラーがでる)。

rate - 再生の状態。0.0 が停止で、1.0 が通常のスピードでの再生。0 - 1.0 の間だとゆっくり再生。1.0 を超えると通常のスピードよりも早く再生している。これを指定することで、再生スピードの調整ができる。

volume - 再生音量。1.0 が最大となっているが、それ以上の値を与えることも可能で、その場合は、標準の設定よりも音量を上げることができる。

再生位置に関する物は、AVPlayerItem と同じ感じ。

player.currentTime

player.seekToTime(time)

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

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

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

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

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

これ以外にも、AVPlayer オブジェクトに、observer を登録することができる。これによって、

observer = player.addPeriodicTimeObserverForInterval(interval,queue:queue,usingBlock:Proc.new.{|time|})

observer = player.addBoundaryTimeObserverForTimes(times,queue:queue,usingBlock:Proc.new.{|time|})

player.removeTimeObserver(observer)

addPeriodicTimeObserverForInterval(interval,queue:queue,usingBlock:Proc.new.{|time|}) - 再生中に、CMTime で指定した interval ごとに block 内の処理を実行する。その際には、CMTime が渡される。queue には、dispatch queue を指定できるが、nil を入れると、main queue が使われると書いてある。この辺りは勉強不足。

addBoundaryTimeObserverForTimes(times,queue:queue,usingBlock:Proc.new.{|time|}) - times には、CMTime value の array を指定して、その指定時間を超えるごとに block 内の処理が行われる。ここでも、block には CMTime が渡される。

removeTimeObserver(observer) - 登録した observer をキャンセルする。追加した observer ごとに、必ずキャンセル処理を入れる必要がある。