AVFoundation自定义相机问题及RosyWriter的使用

来源:互联网 发布:商家入驻系统源码 编辑:程序博客网 时间:2024/05/26 19:14
1.‘实时视频流AVCaptureVideoDataOutput’和‘系统视频录制功能AVCaptureMovieFileOutput’冲突。
1.1 AVFoundation配置阶段
具体为在配置addOutput阶段,不能同时配置AVCaptureVideoDataOutput和AVCaptureMovieFileOutput。
二者无法同时启用。如果两者同时配置,可以实现‘系统视频录制功能’但是却不再输出‘实时视频流’。
如果要同时实现‘视频录制’和‘实时视频流’,可以使用AVCaptureVideoDataOutput代理的sampleBuffer作为数据源,
然后使用AVAssetWriter来做视频音频编码以及写入本地文件,这样就同时实现了视频录制’和‘实时视频流’。
具体使用可以阅读苹果官方文档RosyWriter并下载项目代码。

1.2 RosyWriter的使用
RosyWriter代码可以分为三部分:Renderer(渲染)、OpenGLPixelBufferView(渲染结果显示)、MovieRecorder(存储)

1.2.1 Renderer(渲染)
渲染使用的方式有4种,分别是:OpenGL、CPU、OpenCV、CIFilter,默认使用的是OpenGL,可以选择擅长的方式。
当启动RosyWriter的时候,发现视频预览颜色是紫色,原因是着色器(shader)里将green设置为0了,修改方法是
找到Shaders文件夹里的myFilter.fsh片段着色器文件,将下面代码拷贝替换,实际是将green改回正常值
gl_FragColor.bgra = vec4(color.b, color.g, color.r, color.a);

1.2.2 OpenGLPixelBufferView(渲染结果显示)
渲染结果显示使用的是OpenGL,研读代码,可以了解到OpenGL是怎样将pixelBuffer加载到自定义layer的。

1.2.3 MovieRecorder(存储)
如果只是需要实现’实时视频流保存视频功能‘,只将MovieRecorder代码拖到项目即可,具体使用可以参考
RosyWriterCapturePipeline的startRecording函数

1.3相关链接
iOS AVCaptureVideoDataOutputSampleBufferDelegate 录制视频
RosyWriter官方文档及demo


2.预设分辨率过高导致录制视频时crash:No active/enabled connections
控制台输出:
 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] No active/enabled connections'

问题原因:录制视频支持的分辨率与拍照的分辨率不是完全等价,即适用于拍照的分辨率不一定适合拍照。所以,如果
设置了一个高分辨率的预设值,就会导致上面的问题。
解决方法:简单粗暴的方式就是,拍照前设置预设分辨率为较高的值,录制视频前设置预设分辨率为相应支持的值
比如视频一般使用预设值为:AVCaptureSessionPreset640x480
如果是图片可以设置更高的,比如:AVCaptureSessionPreset1280x720,或者用AVCaptureSessionPresetPhoto





1 0
原创粉丝点击