如何在ios中增加视频录制fps速率

时间:2015-06-02 13:26:19

标签: ios objective-c avcapturesession avcapturedevice

我在磁盘上保存视频帧(图像)时遇到问题。它以8fps,10fps,12fps,15fps的速度返回低帧/秒。如果我玩iphone相机应用程序并录制视频,那么我得到29fps,30fps,所以我希望我的应用程序计算与iphone相机应用程序相同的fps

- (void) blCameraControllerDidCaptureSampleBuffer:(CMSampleBufferRef)sampleBuffer
{
  if(shouldSaveVideoToGallery)
    {
        [analysisQueue addOperationWithBlock:^{
            //        CMTime t=CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
            CMTime t=CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
            float time=CMTimeGetSeconds(t);//t.value;
            if(initialBufferTime==-1)
            {
                initialBufferTime=time;
            }

            time=time-initialBufferTime;


            UIImage *analysisImage=[self imageFromSampleBuffer:sampleBuffer];
           // [analysisImageA addObject:analysisImage];

            CMSampleBufferInvalidate(sampleBuffer);
            CFRelease(sampleBuffer);

            NSString *videoName=[[currentVideoPath lastPathComponent] stringByDeletingPathExtension];

             NSString *  analysisImagePath=[[[OrbisMediaGallery sharedGallery] getMediaGalleryFolderPath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_analysisScreen%d.jpg", videoName, (int)(analysisScreens.count+1)]];
            [imagePathA addObject:analysisImagePath];


            NSData *imageData=UIImageJPEGRepresentation(analysisImage, 0.5);
            [imageData writeToFile:analysisImagePath atomically:NO];

            [analysisQueue saveFrameOnDisk:analysisImage andImgPath:analysisImagePath];

            NSDictionary *d=@{@"analysisScreenPath": analysisImagePath, @"analysisScreenTime": [NSNumber numberWithFloat:time]};
            NSLog(@"_analysisScreen: %@", d);
            [analysisScreens addObject:d];

            NSLog(@"isRecording:%@, analysisQueue.operationCount:%@", @(isRecording), @(analysisQueue.operationCount));
            if(analysisQueue.operationCount<=1)
                isDoneGeneratingFrames=YES;
            if(!isRecording && analysisQueue.operationCount<=1)
            {

             //   [self saveImageOnDisk];
                [self saveFramesOfVideo:currentVideoPath startTime:[d objectForKey:@"analysisScreenTime"]];
                // [[OrbisMediaGallery sharedGallery] saveAnalysisImages:analysisScreens forVideoAtPath:currentVideoPath];
}
}];
    }
    else
    {
        isDoneGeneratingFrames=YES;
    }



}

它是视频录制时每次调用的委托方法。实际上我在这些线上面临问题

NSData *imageData=UIImageJPEGRepresentation(analysisImage, 0.5);
[imageData writeToFile:analysisImagePath atomically:NO];

当我评论这些行时,它将返回更高的帧速率,就像iphone相机应用程序一样。但是对这两行进行评论时,问题就出现了,我无法停止视频并以框架方式看到它,请不要告诉我将这些行放入后台线程或gcd。我曾尝试将它放在后台线程上。但是fps率并没有改变。

1 个答案:

答案 0 :(得分:0)

由于空间限制而将评论作为答案发布。

了解这里发生的事情。您正在拍摄原始相机数据,即每个像素4个字节(以rgba为单位)乘以每个帧的分辨率(高度x相机分辨率宽度)并在尝试将其写入磁盘之前将其传递到内存中。每帧的大小将是几MB,你想每秒30次(或更多)吗?这不会发生,不管你是否会很快耗尽空间。

实际上,您的帧速率正在被丢弃,因为委托无法处理传入的数据包。我相信(如果内存对我很好),文档甚至会警告在回调中将处理保持在最低限度。

目标尚不清楚。使帧速率恢复的一种方法是将图像处理移动到浅队列,这将在队列达到其限制(您在创建时设置)时删除处理块。明白这只会改变瓶颈。另一种方法是将相机捕获设置为低得多的分辨率。但是,我怀疑这些都不能满足您的需求。您需要做的是重新设计整个过程。

再一次不理解你的目标,不可能推荐一个好的解决方案,即你只是将这些帧保存为图像,因为这是用户暂停视频时显示给定帧的最简单方法,或者你真的需要保留所有这些图像?

总而言之,如果您详细说明您的需求,这将无效,或许可以找到满足您需求的解决方案。