&bookmark_hatena()
以下のサイトが参考になる
キーとなるクラスはAVAsset
- AVAssetはメディアデータの集合
- メディアデータとはタイトル、再生時間、表示サイズ等の情報
AVAssetを作る。
例 URLから作る
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetから情報を取り出す。
静止画像を取り出すには
AVFoundation.PGのP11付近参照
再生の制御
AVPlayerを用いてAVAssetの再生を管理する。
AVAssetとAVPlayerはAVPlayerItemを媒介として関係する。
AVPlayerItemは再生の状態や設定等を入れこんだもの。
再生処理
再生の二つのタイプ
- ファイルベース
- ストリームベース(HTTPライブストリーム)
がある。
ファイルベースのAVAssetの再生
- トラックのロード:loadValuesAsynchronouslyForKeys:completionHandler:
- AVAssetからAVPlayerItemのインスタンス作成
- AVPlayerItemをAVPlayerにセット
- AVPlayerItemの状態が再生可能になるまで待機(キー値監視する)
ストリームベースの再生
- URLから直接AVPlayerItemを作成する:[AVPlayerItem playerItemWithURL:url];
- 後は同じ
再生開始
[player play];
速度変更や再生位置変更等をAVPlayerで設定できる。
余談
複数再生等はAVPlayeを継承したAVQueuePlayerでできる。
再生状態の監視
キー値監視すれば良い。
メディアキャプチャ
カメラ、マイク、ビデオ等(入力デバイス)から情報を取り出してムービーや静止画(出力)として表示する(キャプチャする)処理。
クラス
- 入力デバイス AVCaptureDevice
- 出力 AVCaptureOutput
- 入力と出力をとりもつ(管理する)部分(セッション) AVCaptureSession
- 入力デバイスをセッションとつなげる部分 AVCaptureInput
- 出力をセッションとつなげる部分 AVCaptureConnection
つまり、セッションはInputとConnectionを使って入力デバイスと出力部分につながっている。
入力デバイス-Input-セッション-Connection-outPut
となる。
使い方
- セッションを入出力につなげる。
- セッションを設定する。
- セッションを開始する。[session startRunning];
セッションの設定
解像度
- AVCaptureSessionPresetHigh/Medium/Low 品質。MediumがWifi、Lowが3G用
- AVCaptureSessionPreset640x480 VGA
- AVCaptureSessionPreset1280x720 720p HD
- AVCaptureSessionPresetPhoto 写真用
サイズ固定の場合、サイズのサポートを事前にチェックすること。sesstion canSetSessionPreset:
セッションの状態監視
セッション実行中 running
プロパティ
中断されたか interruptedプロパティ
入力デバイス(AVCaptureDevice)
どのデバイスが使えるか? devices
利用可能デバイスの変更を通知しておきたいなら
- AVCaptureDeviceWasConnectedNotification
- AVCaptureDeviceWasDisconnectedNotification
を登録しておく。
デバイスに使えるメディアを聞く
- hasMediaType:
- supportsAVCaptureSessionPreset: 特定のプリセット(前述の解像度等)をサポートしているか
デバイスに備わっているモードの確認
焦点モード
isFocusModeSupported:で聞ける。focusModeプロパティでモード指定
- AVCaptureFocusModeLocked 焦点距離ロックモード
- AVCaptureFocusModeAutoFocus 焦点がシーンの中心から外れても焦点維持
- AVCaptureFocusModeContinuousAutoFocus 必要に応じてオートフォーカスになるモード
余談
- 焦点をあわせているかadjustingFocusプロパティ
露出モード
isExposureModeSupported:で聞ける。exposureModeプロパティで指定
- AVCaptureExposureModeLocked:露出固定
- AVCaptureExposureModeAutoExpose:露出変更
フラッシュモード
hasFlash、isFlashModeSupported:で聞き、flashModeプロパティで指定
- AVCaptureFlashModeOff/On/Auto
トーチモード
ずっと点灯させる。
hasTorch,isTorchModeSupported:で聞き、torchModeプロパテで指定
- AVCaptureTorchModeOff/On/Auto
ホワイトバランス
isWhiteBalanceModeSupported:できき、
whiteBalanceModeプロパティで指定
- AVCaptureWhiteBalanceModeLocked 固定
- AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance:自動
注意
モードをかえるとき、プロパティはロックしてから取得する事。
if ([devaide lockForConfiguration:&error]) {
//処理
[devaice unlockForConfiguration];
}
デバイスの切り替え
略
デバイスのセッションへの登録方法
- デバイスを指定してAVCaptureDeviceInputを作る。 input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];。nilなら失敗。
- セッションに登録 [sesstion addInput:input]; addInputして良いかは事前に聞く([captureSession canAddInput:input]こと。
出力のセッションへの登録方法
出力の種類
- AVCaptureMovieFileOutput ムービーファイルへの出力
- AVCaptureVideoDataOutput 出力中のビデオのフレームデータを出力
- AVCaptureAudioDataOutpu 出力中のビデオのオーティオデータを出力
- AVCaptureStillImageOutput 静止画像を出力
セッションへの登録方法
- [sesstion canAddOutput:output]で聞いてOKなら[sesstion addOutput:output];
ムービーの保存
AVCaptureMovieFileOutputを使用する。
- 録画開始 startRecordingToOutputFileURL:recordingDelegate:
- AVCaptureFileOutputRecordingDelegateはcaptureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error:で終了を実装する。
- 終了の実装において正常保存の確認はerrorで、[[error userInfo]にはAVErrorRecordingSuccessfullyFinishedKeyでエラー要因が入っている。
- AVErrorDiskFull
- AVErrorDeviceWasDisconnected
- AVErrorSessionWasInterrupted
フレームデータの出力に付いて(AVCaptureVideoDataOutput)
データはdelegateから渡される。
- デリゲートのセット。setSampleBufferDelegate:queue
- キューを指定する必要がある。
- データがcaptureOutput:didOutputSampleBuffer:fromConnection:によって渡される。
- データはCMSampleBuffer
- 出力の設定はvideoSettingsで設定可能。辞書で
- kCVPixelBufferPixelFormatTypeKey でピクセルを設定
- kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange iPhone4向け
- kCVPixelFormatType_32BGRA iPhone4向け
- kCVPixelFormatType_422YpCbCr8 iPhone3S向け
- kCVPixelFormatType_32BGRA iPhone3S向け
注意
- 出力の解消度はもっとも低いものに設定しておかないと電力が無駄に消費される。
- captureOutput:didOutputSampleBuffer:fromConnection:で処理をもたつかせると配信が停止する。
- minFrameDurationプロパティでフレームレートを調整する必要
静止画像のキャプチャ(AVCaptureStillImageOutput)
- AVCaptureStillImageOutput作成
- 設定する辞書を作成 AVVideoCodecJPEG AVVideoCodecJPEG AVVideoCodecKey
- キャプチャ開始 出力にcaptureStillImageAsynchronouslyFromConnection:completionHandler:
録画内容の表示(AVCaptureVideoPreviewLayer)
セッションと直接つなげる。Connectionがいらない。
AVCaptureVideoPreviewLayer *l = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
[self.layer addSublayer:l];
- 回転方法はレイヤのorientationプロパティを設定する
設定
- 重心設定 videoGravity
- AVLayerVideoGravityResizeAspect: アスペクト比維持
- AVLayerVideoGravityResizeAspectFill:アスペクト比固定で画面全域
- AVLayerVideoGravityResize:アスペクト比変化で画面全域
最終更新:2012年08月19日 15:42