想實現(xiàn)多個視頻或者圖片之間的轉(zhuǎn)場效果的,因為用到ffmpeg的很多功能,比如混音,拼接,截取等一大堆都是用ffmpeg實現(xiàn)的,所以想著轉(zhuǎn)場也用ffmepg來實現(xiàn), 后來找到實現(xiàn)是通過ffmpeg的摳圖(chromakey)功能實現(xiàn)轉(zhuǎn)場的效果,不過淡入淡入是ffmpeg的fade指令。不過這個轉(zhuǎn)場的效果需要自己去合成轉(zhuǎn)場視頻,然后相當(dāng)于于一個轉(zhuǎn)場視頻和其他視頻拼接起來。
不過最后面沒有采用這個方案┭┮﹏┭┮,改成是opengl實現(xiàn)轉(zhuǎn)場功能了,因為ffmpeg實現(xiàn)的轉(zhuǎn)場功能需要合成轉(zhuǎn)場視頻,這個過程很費時,然后我用opengl實現(xiàn)的轉(zhuǎn)場通過濾鏡,是實時的效果。不過還是把這個ffmpeg轉(zhuǎn)場功能記錄一下。
廢話不多說,執(zhí)行的的指令如下:
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] 視頻的一幀和動態(tài)圖gif合成遮罩圖,然后根據(jù)chromakey功能,把gif上面 0x0000FF藍色的覆蓋部分用視頻[1:v]進行替換,最后[0:v] [ckout]再和前一個視頻的最后一幀圖片進行合成轉(zhuǎn)場視頻。
1、第一步是合成轉(zhuǎn)場需要的gif,這個是一個純藍色的移動動畫,底片是扣空的,不是白色的,如下:

2、second.mp4-i gif_temp.gif -filter_complex "[1:v] [2:v] overlay [cmask];[cmask] format = rgba,chromakey = 0x0000FF:0.3 [ckout]; 這部分的功能執(zhí)行之后,就可以輸出一個視頻從右移動的效果了
3、如果是上移動,下移動或者其他效果,可以制作不一樣的gif效果便可,比如百葉窗、旋轉(zhuǎn)等。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最終實現(xiàn)方案是需要合成一個轉(zhuǎn)場視頻,然后才能查看效果,比起opengl來說,就差很多,說一下opengl的實現(xiàn)方案:
播放分為視頻和圖片:
視頻播放需要通過mediaplayer和surfaceTexture綁定,然后通過surfaceTexture.updateTexImage()來推動更新,轉(zhuǎn)場默認是兩秒,所以這時候視頻的播放適合opengl一起運行,把視頻的幀作為opengl的紋理進行輸入,然后經(jīng)過opengl的動畫效果,輸出動畫。
圖片則直接是手動推動onDrawFrame的更新,直接以圖片做紋理輸入opengl輸出動畫。
下一個文章具體介紹opengl的轉(zhuǎn)場實現(xiàn)。