これは以前はcaptureOutput.minFrameDuration
で行われていたと思います。ただし、これはiOS5では非推奨です。
代わりに、どうやらAVCaptureConnection
のvideo.minFrameDuration
を使用する必要があります。だから私は私の入力、私の出力を持っています、私はそれらの両方をキャプチャセッションに追加します-どこでキャプチャ接続にアクセスできますか?セッションで作成されたと思いますが、どこで?
addInputWithNoConnections
とaddOutputWithNoConnections
を使用してI/Oを追加してから、手動で接続を作成してみてください。しかし、これは最大フレームレートを設定するためだけに少し面倒なようです。さらに、Xcodeはこれらのメソッドが存在しないと文句を言います。
クリス、私はこの問題を解決したと思います:
(編集-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 *値のビデオフレームレートが正しく設定されていることを確認できます。 "上記のコードで「覚えている」。
フレームレートを正常にクランプするには、両方videoMinFrameDuration
とvideoMaxFrameDuration
を同じ値に設定する必要があることに注意してください-minを単独で設定しても機能しないようです。 iPhone4sでのテスト。これは文書化されていないようです。
ジョシュ
AVCaptureConnection
videoMinFrameDuration
は非推奨です。 AVCaptureDevice
activeVideoMinFrameDuration
/activeVideoMaxFrameDuration
を使用します。 AVCaptureDevice クラスリファレンスの最初のコードスニペットが質問に答えます。
以下のメンバーを想定します。
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の初期化子に渡します。
キランが言ったように、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);