メディアファイルの扱い 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 ごとに、必ずキャンセル処理を入れる必要がある。