2012-02-29 3 views
4

私はアプリケーションにビデオキャプチャフレームレートを絞ろうとしていますが、VoiceOverのパフォーマンスに影響していることがわかりました。私はAVCaptureフレームワークでビデオキャプチャフレームレートを調整したい

現時点では、ビデオカメラからフレームをキャプチャし、できるだけ早くOpenGLルーチンを使用してフレームを処理します。キャプチャプロセスで特定のフレームレートを設定したいと思います。

私はvideoMinFrameDurationまたはminFrameDurationを使用してこれを行うことができると予想していましたが、これはパフォーマンスに違いはないようです。何か案は?

NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 
for (AVCaptureDevice *device in devices) 
{ 
    if ([device position] == AVCaptureDevicePositionBack) 
    { 
     backFacingCamera = device; 
        // SET SOME OTHER PROPERTIES 
    } 
} 


// Create the capture session 
captureSession = [[AVCaptureSession alloc] init]; 

// Add the video input 
NSError *error = nil; 
videoInput = [[[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error] autorelease]; 

// Add the video frame output 
videoOutput = [[AVCaptureVideoDataOutput alloc] init]; 
[videoOutput setAlwaysDiscardsLateVideoFrames:YES]; 

[videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; 
[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 



// Start capturing 
if([backFacingCamera supportsAVCaptureSessionPreset:AVCaptureSessionPreset1920x1080]) 
{ 
    [captureSession setSessionPreset:AVCaptureSessionPreset1920x1080]; 
    captureDeviceWidth = 1920; 
    captureDeviceHeight = 1080; 
    #if defined(VA_DEBUG) 
    NSLog(@"Video AVCaptureSessionPreset1920x1080"); 
    #endif 
} 
else do some fall back stuff 

// If you wish to cap the frame rate to a known value, such as 15 fps, set 
// minFrameDuration. 
AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; 
if (conn.supportsVideoMinFrameDuration) 
    conn.videoMinFrameDuration = CMTimeMake(1,2); 
else 
    videoOutput.minFrameDuration = CMTimeMake(1,2); 


if ([captureSession canAddInput:videoInput]) 
    [captureSession addInput:videoInput]; 


if ([captureSession canAddOutput:videoOutput]) 
    [captureSession addOutput:videoOutput]; 

if (![captureSession isRunning]) 
    [captureSession startRunning]; 

何か不足していますか?これがスロットルに最適な方法ですか?

AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; 
if (conn.supportsVideoMinFrameDuration) 
    conn.videoMinFrameDuration = CMTimeMake(1,2); 
else 
    videoOutput.minFrameDuration = CMTimeMake(1,2); 
+0

私は私の元のメッセージでは明確ではありませんでした。 minFrameDurationメソッドは何もしないように見えますが、フレームレートを減らすことはありません。私は、ios 5.0 SDKを使用してios 4.3ターゲットに対してビルドしています。 –

答えて

2

いずれかが動作するには、videoMinFrameDurationとvideoMaxFrameDurationの両方を設定する必要があります。

例:

[conn setVideoMinFrameDuration:CMTimeMake(1,1)]; 
[conn setVideoMaxFrameDuration:CMTimeMake(1,1)]; 
5

マイク・ウルリッヒの答えは、IOS 7これらの2つの方法が、残念ながらios7に廃止されましたまで働きました。 AVCaptureDevice自体にactiveVideo{Min|Max}FrameDurationを設定する必要があります。何かのように:

int fps        = 30; // Change this value 
AVCaptureDevice *device    = ...; // Get the active capture device 
[device lockForConfiguration:nil]; 
[device setActiveVideoMinFrameDuration:CMTimeMake(1, fps)]; 
[device setActiveVideoMaxFrameDuration:CMTimeMake(1, fps)]; 
[device unlockForConfiguration]; 
関連する問題