4

didOutputSampleBuffer デリゲートがあまり頻繁に呼び出されないように、iPhone 4S のビデオ デバイスのフレーム レートを遅くしたいと考えています。これは、各フレームを処理し、詳細には大きなフレームが必要なため、パフォーマンスを向上させるためです。

AVSessionをセットアップするときに、次を使用してそうしようとしました:

AVCaptureConnection *conn = [self.output connectionWithMediaType:AVMediaTypeVideo];
[conn setVideoMinFrameDuration:CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND)];
[conn setVideoMaxFrameDuration:CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND)];

しかし、これは何の効果もありません。CAPTURE_FRAMES_PER_SECOND を 1 から 60 に変更しても、パフォーマンスの違いやビデオ キャプチャの速度低下は見られません。なぜこれは効果がないのですか?ビデオ デバイスのキャプチャ フレーム レートを遅くするにはどうすればよいですか?

次のコードを使用してセッションをセットアップしました。

// Define the devices and the session and the settings
self.session = [[AVCaptureSession alloc] init];

//self.session.sessionPreset = AVCaptureSessionPresetPhoto;
//self.session.sessionPreset = AVCaptureSessionPresetHigh;
self.session.sessionPreset = AVCaptureSessionPreset1280x720;

self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

// Add the video frame output
self.output = [[AVCaptureVideoDataOutput alloc] init];
[self.output setAlwaysDiscardsLateVideoFrames:YES];
self.output.videoSettings = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]
                                                        forKey:(id)kCVPixelBufferPixelFormatTypeKey];

// A dispatch queue to get frames
dispatch_queue_t queue;
queue = dispatch_queue_create("frame_queue", NULL);

// Setup the frame rate    
AVCaptureConnection *conn = [self.output connectionWithMediaType:AVMediaTypeVideo];
[conn setVideoMinFrameDuration:CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND)];
[conn setVideoMaxFrameDuration:CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND)];

// Setup input and output and set the delegate to self
[self.output setSampleBufferDelegate:self queue:queue];
[self.session addInput:self.input];
[self.session addOutput:self.output];

// Start the session
[self.session startRunning];

以下の「didOutputSampleBuffer」デリゲート実装を使用してフレームをキャプチャします。

// The delegate method where we get our image data frames from
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
{

    // Extract a UImage
    CVPixelBufferRef pixel_buffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixel_buffer];

    // Capture the image
    CGImageRef ref = [self.context createCGImage:ciImage fromRect:ciImage.extent];

    // This sets the captured image orientation correctly
    UIImage *image = [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationLeft];

    // Release the CGImage
    CGImageRelease(ref);

    // Update the UI on the main thread but throttle the processing
    [self performSelectorOnMainThread:@selector(updateUIWithCapturedImageAndProcessWithImage:) withObject:image waitUntilDone:YES];

}
4

3 に答える 3

1

これは部分的な回答です。iOS 5 と iOS 6 の間で Quicktime ビデオ キャプチャ エンジンに変更があったと思います。iOS 5 では、60 FPS でビデオをキャプチャすることができ、これを利用したアプリがいくつかありましたスムーズなスローモーションで再生するために記録します (例: SloPro アプリ)。iOS 6 では、同じ方法で 60 FPS を達成することはできなくなりました。この問題については、MacRumors フォーラムのスレッドで長い議論が行われています。

iPhone 4S、iOS 6.1 の脱獄で 60 FPS のビデオの録画が可能になるか?

問題の解決策を提供する情報がそこにあることを願っています。誰かがこれを再び機能させることができるかどうか、私は非常に興味があります。60FPSでの録画が恋しい…

于 2013-02-21T14:30:06.103 に答える
1

どの iOS を実行しているかはわかりませんが、コードを次のように囲みます。

AVCaptureConnection *conn = [self.output connectionWithMediaType:AVMediaTypeVideo];
if ([conn isVideoMaxFrameDurationSupported] && [conn isVideoMinFrameDurationSupported])
{
  [conn setVideoMinFrameDuration:CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND)];
  [conn setVideoMaxFrameDuration:CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND)];
}

else
  NSLog(@"Setting Max and/or Min frame duration is unsupported";

それからそこから行きます。お使いの iOS ではサポートされていないと思われます。

于 2013-02-23T20:50:12.237 に答える