我正在使用AVCaptureVideoPreviewLayer允许用户从iPhone相机中拍摄照片。因此,我有一个AVCaptureSession,其输入为AVCaptureDeviceInput,输出为AVCaptureStillImageOutput。

我在视频Feed的顶部也有动画和控件,但这些动画和控件比较缓慢且生涩,因为后面的视频以最大帧速率运行并占用CPU/GPU。

我想限制AVCaptureVideoPreviewLayer的帧速率。我看到在AVCaptureVideoDataOutput上有minFrameDuration属性,但是在AVCaptureVideoPreviewLayer上找不到类似的东西。

最佳答案

我认为问题与帧速率无关。因此,我将建议一些技巧来提高您的应用程序的性能:

1)AVCaptureVideoPreviewLayer只是显示摄像机输出的CALayer的子类,因此无法限制其帧速率。

2)检查您是否将动画放置在正确的位置,这取决于您拥有哪种动画,如果是CALayer,则动画层应该是主 Canvas View 层的子层(不是AVCaptureVideoPreviewLayer !!!),如果它是UIView,则它必须是主 Canvas View 的 subview 。

3)您可以通过设置 session 预设来提高应用程序的性能:

[captureSession setSessionPreset:AVCaptureSessionPresetLow];

默认情况下,它设置为高,您可以根据需要进行设置,这只是视频质量,如果性能很高,则不是理想的选择。

4)我制作了自己的测试应用,随机动画覆盖了视频预览层(但这是我的主 View 的 subview !!!),即使在旧的iPod上,一切都进行得很顺利,我可以为您提供一个用于初始化捕获的代码 session :
// Create a capture session
self.captureSession = [AVCaptureSession new];
if([captureSession canSetSessionPreset:AVCaptureSessionPresetHigh]){
    [captureSession setSessionPreset:AVCaptureSessionPresetHigh];
}
else{
    // HANDLE ERROR
}

// Find a suitable capture device
AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

// Create and add a device input
NSError *error = nil;
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&error];
if([captureSession canAddInput:videoInput]){
    [captureSession addInput:videoInput];
}
else{
    // HANDLE ERROR
}

// Create and add a device still image output
AVCaptureStillImageOutput *stillImageOutput = [AVCaptureStillImageOutput new];
[stillImageOutput addObserver:self forKeyPath:@"capturingStillImage" options:NSKeyValueObservingOptionNew context:AVCaptureStillImageIsCapturingStillImageContext];
if([captureSession canAddOutput:stillImageOutput]){
    [captureSession addOutput:stillImageOutput];
}
else{
    // HANDLE ERROR
}

// Setting up the preview layer for the camera
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
previewLayer.frame = self.view.bounds;

// ADDING FINAL VIEW layer TO THE CAMERA CANVAS VIEW sublayer
[self.view.layer addSublayer:previewLayer];

// start the session
[captureSession startRunning];

5)最后,在iOS5中,您可以设置最小和最大视频帧速率,这还可以提高应用程序的性能,我想这正是您的要求。检查此链接(设置最小和最大视频帧速率):

http://developer.apple.com/library/mac/#releasenotes/AudioVideo/RN-AVFoundation/_index.html

希望我的答案是明确的。

最好的祝愿,

阿尔特姆

关于iphone - 控制帧速率或限制AVCaptureVideoPreviewLayer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6493823/

10-09 02:05