想实现多个视频或者图片之间的转场效果的,因为用到ffmpeg的很多功能,比如混音,拼接,截取等一大堆都是用ffmpeg实现的,所以想着转场也用ffmepg来实现, 后来找到实现是通过ffmpeg的抠图(chromakey)功能实现转场的效果,不过淡入淡入是ffmpeg的fade指令。不过这个转场的效果需要自己去合成转场视频,然后相当于于一个转场视频和其他视频拼接起来。
不过最后面没有采用这个方案┭┮﹏┭┮,改成是opengl实现转场功能了,因为ffmpeg实现的转场功能需要合成转场视频,这个过程很费时,然后我用opengl实现的转场通过滤镜,是实时的效果。不过还是把这个ffmpeg转场功能记录一下。
废话不多说,执行的的指令如下:
ffmpeg -i jpg/last_frame.jpg -i second.mp4-i gif_temp.gif -filter_complex "[1:v] [2:v] overlay [cmask];[cmask] format = rgba,chromakey = 0x0000FF:0.3 [ckout]; [0:v] [ckout] overlay" -t 2 -y two_imag_transition.mp4
该指令的意思是,-filter_complex "[1:v] [2:v] overlay [cmask] 视频的一帧和动态图gif合成遮罩图,然后根据chromakey功能,把gif上面 0x0000FF蓝色的覆盖部分用视频[1:v]进行替换,最后[0:v] [ckout]再和前一个视频的最后一帧图片进行合成转场视频。
1、第一步是合成转场需要的gif,这个是一个纯蓝色的移动动画,底片是扣空的,不是白色的,如下:
2、second.mp4-i gif_temp.gif -filter_complex "[1:v] [2:v] overlay [cmask];[cmask] format = rgba,chromakey = 0x0000FF:0.3 [ckout]; 这部分的功能执行之后,就可以输出一个视频从右移动的效果了
3、如果是上移动,下移动或者其他效果,可以制作不一样的gif效果便可,比如百叶窗、旋转等。gif是纯色空白底就行。
如果是淡入淡入的效果,ffmpeg有线程的指令,合成速度很快,指令如下:
ffmpeg -loop 1 -i input1.jpg -r 30 -filter_complex "[0:v] fade=in:0:60" -c:v libx264 -pix_fmt yuv420p -t 2 -y test.mp4
ffmpeg最终实现方案是需要合成一个转场视频,然后才能查看效果,比起opengl来说,就差很多,说一下opengl的实现方案:
播放分为视频和图片:
视频播放需要通过mediaplayer和surfaceTexture绑定,然后通过surfaceTexture.updateTexImage()来推动更新,转场默认是两秒,所以这时候视频的播放适合opengl一起运行,把视频的帧作为opengl的纹理进行输入,然后经过opengl的动画效果,输出动画。
图片则直接是手动推动onDrawFrame的更新,直接以图片做纹理输入opengl输出动画。
下一个文章具体介绍opengl的转场实现。