之前解析介绍的是GPUImage源码解析、图片模糊、视频滤镜,明白了GPUImage的强大功能,这次介绍的是两个视频的重叠,可以把两个视频文件合并,也可以把视频和录像结合在一起。
视频的截图如下,视频由两个视频合成,一个来自于文件abc.mp4,一个来自于摄像头。
摄像头采集的数据通过GPUImageVideoCamera进入响应链,视频文件的数据通过GPUImageMovie进入响应链,在GPUImageDissolveBlenderFilter进行合并,最后把数据传给响应链的终点GPUImageView以显示到UI和GPUImageMovieWriter以写入临时文件,最后临时文件通过ALAssetsLibrary写入系统库。
GPUImageDissolveBlendFilter类继承GPUImageTwoInputFilter,添加属性mix作为片元着色器的mix参数。GPUImageDissolveBlendFilter在响应链上需要接受两个输入,当两个输入都就绪时,会通过mix()操作把输入混合,并且输出到响应链上。
思考1:如果只有一个输入会如何?
GPUImageMovie类继承了GPUImageOutput类,一般作为响应链的源头,可以通过url、playerItem、asset初始化。
GPUImageMovieWriter类实现GPUImageInput协议,一般作为响应链的终点。shouldPassthroughAudio表示是否使用源音源。
movieFile.audioEncodingTarget = movieWriter;
表示音频来源是文件。
if (audioFromFile) {
// 响应链
[movieFile addTarget:filter];
[videoCamera addTarget:filter];
movieWriter.shouldPassthroughAudio = YES;
movieFile.audioEncodingTarget = movieWriter;
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
}
else {
// 响应链
[videoCamera addTarget:filter];
[movieFile addTarget:filter];
movieWriter.shouldPassthroughAudio = NO;
videoCamera.audioEncodingTarget = movieWriter;
movieWriter.encodingLiveVideo = NO;
}
思考2:音频来源的不同会对响应链造成什么样的影响?为什么?
4、响应链 响应链以GPUImageVideoCamera和GPUImageMovie作为输入,最终以GPUImageMovieWriter为输出。
[videoCamera startCameraCapture];
[movieWriter startRecording];
[movieFile startProcessing];
[movieWriter setCompletionBlock:^{
}];
思考3:movieWriter的回调是什么时候调用的?由哪里触发?
思考4:movieWriter的encodingLiveVideo有什么用?把其设置为YES和NO试试,观察是否有影响?
做demo的过程中遇到坑,GPUImage上面有Issues,但是并没有人解答ʕ̡̢̡ʘ̅͟͜͡ʘ̲̅ʔ̢̡̢。 代码地址在这里,参考链接上有趟坑的时候查到的一些资料。
几个思考题都是做demo过程比较迷惑不解的地方和遇到的问题,答案分别是:
思考1:输入只有一个输入的时候,会一直等待第二个输入,不会有输出。问题出现在把videoCamera声明为临时变量,以为添加target会持有videoCamera的引用。实际上就会发生输入只有一个的时候(只有视频文件的信号),同时屏幕是白屏。
思考2:音频的来源不同会导致CMTime的不同,响应链视频信息的CMTime默认采用第一个输入的CMTime,故而修改音频来源的时候需要修改响应链的输入顺序,否则几秒钟的视频文件会产生两个多小时的文件(CMTime不同步导致)。
思考3:movieWriter的回调会在视频处理结束的时候调用,由GPUImageMovie的
reader.status == AVAssetReaderStatusCompleted
触发。思考4:encodingLiveVideo影响的其实是expectsMediaDataInRealTime属性,YES时用于输入流是实时的,比如说摄像头。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有