在摄像机上使用声音输入和滤镜时,GPUImageMovieWriter会生成带空帧的视频

时间:2014-07-25 21:14:42

标签: ios video-capture gpuimage

我正在使用令人印象深刻的iOS GPUImage框架来过滤相机的传入流,然后保存它。完成后,我想关闭包含视图,并打开另一个具有播放选项的视图,以查看刚刚拍摄的电影。事情是,当我什么都不做的时候,我可以完成录制,将文件保存到临时文件,然后将其同步复制到相机胶卷。但是当我使用输入声音和滤镜时,GPUImageMovieWriter似乎放慢了太多,并在视频的开头或结尾产生空帧。

要设置过滤器和内容,并预览实时过滤后的图像,请执行以下操作:

videoCamera=[[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetiFrame960x540 cameraPosition:AVCaptureDevicePositionBack];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:outputURL size:CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)];
movieWriter.encodingLiveVideo = YES;
movieWriter.shouldPassthroughAudio = YES;
videoCamera.audioEncodingTarget = movieWriter;

_filteredVideoView = [[GPUImageView alloc]initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view addSubview:_filteredVideoView];

blendFilter = [[GPUImageNormalBlendFilter alloc]init];
sourcePicture = [[GPUImagePicture alloc] initWithCGImage:[mc getImage]];
[sourcePicture processImage];

[blendFilter addTarget:_filteredVideoView];
[videoCamera blendFilter];
[videoCamera startCameraCapture];

其中所有变量如outputURL和mc都已正确设置。要开始实际录制,我称之为:

[blendFilter addTarget:movieWriter];
[movieWriter startRecording];

要停止录制并保存到相机胶卷,我有以下代码:

videoCamera.audioEncodingTarget = nil;
[movieWriter finishRecording];
[blendFilter removeTarget:movieWriter];
UISaveVideoAtPathToSavedPhotosAlbum(outputPath, nil, NULL, NULL);
[self gotoNextView];

可能文件在帧通过之前开始记录,和/或文件正在被写入临时文件时被复制到相机胶卷。如何确保文件上的所有内容,以及如何在完成后收到通知,以便我可以转到下一个视图?

1 个答案:

答案 0 :(得分:0)

        [self.movieWriter finishRecordingWithCompletionHandler:handler]

将保存视频代码放入完成处理程序块将等到视频完成录制。