web-dev-qa-db-ja.com

iOS5のAVFoundationで最大フレームレートを設定する

これは以前はcaptureOutput.minFrameDurationで行われていたと思います。ただし、これはiOS5では非推奨です。

代わりに、どうやらAVCaptureConnectionvideo.minFrameDurationを使用する必要があります。だから私は私の入力、私の出力を持っています、私はそれらの両方をキャプチャセッションに追加します-どこでキャプチャ接続にアクセスできますか?セッションで作成されたと思いますが、どこで?

addInputWithNoConnectionsaddOutputWithNoConnectionsを使用してI/Oを追加してから、手動で接続を作成してみてください。しかし、これは最大フレームレートを設定するためだけに少し面倒なようです。さらに、Xcodeはこれらのメソッドが存在しないと文句を言います。

18
chris838

クリス、私はこの問題を解決したと思います:

(編集-videoMinFrameDuration videoMaxFrameDurationがサポートされているかどうかを確認する正しい方法については、以下のTomas Caminのコメントを参照してください。ただし、以下のコードは投稿時に正常に機能しました)

以下の行は、AVCaptureConnectionオブジェクトに関連付けられたAVCaptureVideoDataOutputオブジェクトへのアクセスを提供します。

AVCaptureConnection *conn = [output connectionWithMediaType:AVMediaTypeVideo];


CMTimeShow(conn.videoMinFrameDuration);
CMTimeShow(conn.videoMaxFrameDuration);

if (conn.isVideoMinFrameDurationSupported)
    conn.videoMinFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
if (conn.isVideoMaxFrameDurationSupported)
    conn.videoMaxFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);

CMTimeShow(conn.videoMinFrameDuration);
CMTimeShow(conn.videoMaxFrameDuration);

(私がそうであるように)didOutputSampleBufferデリゲートを使用している場合は、デリゲートに渡されたfromConnection AVCaptureConnection *値のビデオフレームレートが正しく設定されていることを確認できます。 "上記のコードで「覚えている」。

フレームレートを正常にクランプするには、両方videoMinFrameDurationvideoMaxFrameDurationを同じ値に設定する必要があることに注意してください-minを単独で設定しても機能しないようです。 iPhone4sでのテスト。これは文書化されていないようです。

ジョシュ

28
Josh Greifer

AVCaptureConnectionvideoMinFrameDurationは非推奨です。 AVCaptureDeviceactiveVideoMinFrameDuration/activeVideoMaxFrameDurationを使用します。 AVCaptureDevice クラスリファレンスの最初のコードスニペットが質問に答えます。

5
Kiran

以下のメンバーを想定します。

AVCaptureConnection         *videoConnection;
AVCaptureVideoDataOutput    *videoOutput;
AVCaptureDeviceInput        *videoInput;

次に、次のようなことを行います。私はこれをテストしていません。これは、ドキュメントを読んだことからの単なる推測です。

AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];   

if ( videoDevice ) {
    NSError *error;
    videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; 

    [captureSession addInput:videoInput];   
}

videoOutput = [[AVCaptureVideoDataOutput alloc] init];
//setup video options
if ([captureSession canAddOutput:videoOutput])
    [captureSession addOutput:videoOutput];

videoConnection = [[AVCaptureConnection alloc] initWithInputPorts:captureSession.inputs output:videoOutput];
videoConnection.videoMinFrameDuration = CMTimeMake(1, frameRate);

[captureSession addConnection:videoConnection];

私はまだ自分のコードをこれに変換していません。変換を行うときに、動作するコードで返信します。複数の入力がcaptureSessionに追加されている場合は、必要な入力を配列に明示的にロードする必要がある場合があります。例えば.

ports = [NSArray arrayWithObject:videoInput];

次に、これをAVCaptureConnectionの初期化子に渡します。

2
Steve McFarlin

キランが言ったように、AVCaptureConnection videoMinFrameDurationはiOS7以降非推奨です。

具体的には、「更新」 Appleの例

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

AVCaptureDeviceInput *input = ... // Following the example

// ** Create and Configure the Video Data Output **
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];

[session addOutput:output];

output.videoSettings = @{
                             (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA)
                             };

device.activeVideoMinFrameDuration = CMTimeMake(1, 15);
0
bauerMusic