前言
其實(shí)FFmpeg大家都耳熟能詳?shù)牡囊粋€(gè)東西了谆奥,知名的ijkplayer 就是有Bilibili開源出來(lái)的播放器也是基于FFmpeg做出來(lái)的。但是FFmpeg不僅僅止于音視頻的播放裁剪功能,還能干些更有趣的事情,就比如說(shuō)視頻的畫面拼接襟交,對(duì)于一個(gè)Android開發(fā)者來(lái)說(shuō),一想到FFmpeg c/c++是跑不掉的伤靠。下載官方庫(kù)捣域,然后編譯成不同平臺(tái)的so,然后在通過(guò)jni集成到項(xiàng)目中宴合,這一個(gè)開頭就難倒了不少開發(fā)者竟宋。一個(gè)問(wèn)題是如何編譯出這個(gè)so。如何把編譯好的文件集成到項(xiàng)目中形纺。這個(gè)我之后的文章會(huì)詳細(xì)說(shuō)明,這里我只和大家說(shuō)說(shuō)有趣在哪里徒欣。
說(shuō)道這里 我不得不說(shuō)逐样,現(xiàn)在各個(gè)大廠都在做統(tǒng)一前端的開發(fā)語(yǔ)言和框架,搞得開發(fā)者TMD頭都大打肝,其實(shí)不還是做得都是一些UI頁(yè)面而已脂新,通過(guò)不同的方式渲染而已,如果真的要做一些定制化的功能粗梭,還是離開不了原生争便。
Android FFmpeg視頻畫面拼接
通過(guò)標(biāo)題大家可能還是不太明白啥意思,我就上幾張我做的這個(gè)App的截圖吧断医,順便放幾張動(dòng)態(tài)圖滞乙,可能大家能知道個(gè)大概功能奏纪。其實(shí)大家看了之后,可能感覺感覺市面上已經(jīng)有做到了這種效果的App了斩启,但是作為一個(gè)Android攻城獅序调,必須要知道他是怎么做出來(lái)的,在ios上做這種效果很容易兔簇,有原生的Api提供发绢,但是苦逼的Android 那只能通過(guò)C/C++來(lái)實(shí)現(xiàn),原生搞的話很難垄琐。
這個(gè)App大概有以下功能(目前并未開源,項(xiàng)目地址)
- 視頻畫面拼接(主要的)
- 視頻寬高裁剪
- 視頻時(shí)長(zhǎng)裁剪
- 添加視頻邊框及修改邊框顏色
- 添加視頻封面
- 添加視頻背景圖片
- 添加視頻水印
- 添加背景音樂
下面是App做出來(lái)的兩個(gè)視頻轉(zhuǎn)gif的圖片
想看視頻的 話點(diǎn)擊下面的鏈接即可
三合一視頻
二合一視頻
這個(gè)app已有下面的頁(yè)面边酒,不過(guò)現(xiàn)在還沒有開源缸濒,還有很多地方要改据某。功能是實(shí)現(xiàn)了。但是頁(yè)面還有很多優(yōu)化的地方曲楚,所以啊 FFmpeg真的很牛逼朦前。接下來(lái)我會(huì)教大家自己怎么實(shí)現(xiàn)這個(gè)功能介杆。那么來(lái)看看做出來(lái)的視頻如何,某音好像沒有這個(gè)功能哦韭寸,
如何實(shí)現(xiàn)這種效果
這一期春哨,我只是教大家如何通過(guò)shell 命令實(shí)現(xiàn)一個(gè)視頻畫面拼接。首先從最基礎(chǔ)的功能來(lái)實(shí)現(xiàn)吧恩伺。然后在根據(jù)當(dāng)前的功能進(jìn)行擴(kuò)展赴背。至于FFmpeg庫(kù)的編譯,一時(shí)半會(huì)兒也說(shuō)不完晶渠。參數(shù)配置也很麻煩凰荚,尤其是不同的平臺(tái)坑很多。這里我就以最簡(jiǎn)單的方式交大家如何實(shí)現(xiàn)吧
第一步
既然要做功能褒脯,第一步當(dāng)然是找相應(yīng)的工具了便瑟,我們可以通過(guò)FFmpeg官網(wǎng)找到,對(duì)應(yīng)自己平臺(tái)的靜態(tài)庫(kù)番川,大家別下錯(cuò)了哈到涂,static binary不要下載錯(cuò)了,下載成源文件了颁督。因?yàn)楣俜揭呀?jīng)給我們編譯好了靜態(tài)庫(kù)践啄,可以直接通過(guò)shell 腳本就可以簡(jiǎn)單的走起來(lái)。
打開鏈接沉御,我這邊選中的是mac os 可以看到底下提供了 static 庫(kù)屿讽。我們可以直接下載下來(lái)就行了。Ubuntu 和windows 都是一樣的 都有現(xiàn)成的庫(kù)吠裆》ヌ福可以下載下來(lái)烂完。
下載下來(lái)就是一個(gè)這個(gè)東西。我這邊大概71M衩婚。還挺大的窜护,因?yàn)槔锩婀俜浇o我們把大部分基本的功能都給編譯進(jìn)去了。所以這么大非春,但是如果我們自己編譯的話柱徙,會(huì)小很多∑骊迹可以吧一下不需要的東西直接disable
第二步
那當(dāng)然是打開我們的terminal,windows 直接win+R 然后cmd就ok护侮,然后cd 到我們下載的ffmpeg靜態(tài)庫(kù)的文件路徑,執(zhí)行一下命令储耐,不出意外的話羊初,這時(shí)候你應(yīng)該可以看到以下頁(yè)面
./ffmpeg
如果出現(xiàn)一下內(nèi)容,說(shuō)明這時(shí)候你的ffmpeg 已經(jīng)ok了
如果說(shuō)權(quán)限不足的話 什湘,cd到你的靜態(tài)庫(kù)路徑下執(zhí)行這個(gè)就可以了长赞。加個(gè)sudo,然后在change mode 一下 賦予777權(quán)限
chmod +x ffmpeg
chmod 777 ffmpeg
這時(shí)候ffmpeg環(huán)境已經(jīng)準(zhǔn)備好了闽撤。接下來(lái)萬(wàn)事俱備只欠東風(fēng)了得哆。
第三步
視頻拼接,那么如何視頻拼接呢哟旗,不用擔(dān)心 ffmpeg 已經(jīng)給我們做好了相應(yīng)的封裝了贩据。只要了解相應(yīng)的命令就可以完成了最基礎(chǔ)的視頻拼接功能了。其實(shí)ffmpeg不僅僅如此啊闸餐,他的功能太強(qiáng)大了饱亮。
先簡(jiǎn)單的來(lái)幾個(gè)命令看看,查看視頻文件信息
./ffmpeg -i input.mp4
這時(shí)候我們可以看到視頻的具體信息fps舍沙,寬高啊近上,視頻質(zhì)量啊,等等很多信息
-i 的指令就是入?yún)⒌姆髡。酉聛?lái)我們直接看如何通過(guò)命令把一個(gè)視頻合在一起戈锻,就比如上面兩個(gè)視頻合在一起的小姐姐,我們通過(guò)電腦簡(jiǎn)單的來(lái)合成一下和媳。
./ffmpeg -i input2.mp4 -i input2.mp4 -filter_complex [0][1]vstack -y output.mp4
成功的話應(yīng)該是以下頁(yè)面
這一個(gè)MP4文件是同級(jí)目錄下的文件,大家可以換成自己的文件名就可以哈街,至于filter_complex嗎留瞳?我這邊就大白話講了,就相當(dāng)于我們java 中的函數(shù)一樣骚秦,你把輸入給他 在這個(gè)方法體內(nèi)她倘,把相應(yīng)的輸出給你璧微。
vstack 可以官網(wǎng)看到這樣的介紹 Stack input videos vertically.就是垂直拼接視頻的意思,同理如何想水平的話硬梁,只要把vstack 改成hstack就可以了前硫,老鐵們是不是很簡(jiǎn)單,很給力荧止,
最主要的是自己通過(guò)命令行就可以完成一些視頻的基本操作屹电,什么ps,Photoshop跃巡,我命令行就ok了危号。哈哈哈哈哈哈哈哈
剛剛作出來(lái)的視頻效果,截圖給大家看看
說(shuō)好的小姐姐呢素邪,tmd 這是什么鬼很可怕外莲,博主換了個(gè)視頻 哈哈哈,但是這個(gè)效果的話產(chǎn)品看到會(huì)罵死人的兔朦,接下來(lái)的文章將會(huì)給大家講解如何優(yōu)化視頻效果偷线。
Ending
希望給老鐵們帶來(lái)的是知識(shí)的儲(chǔ)備而不是時(shí)間的浪費(fèi)。這一期就說(shuō)到這里沽甥,最簡(jiǎn)單的方式實(shí)現(xiàn)視頻畫面的拼接声邦,下一期將會(huì)給大家?guī)?lái)更多的內(nèi)容。大家也可以在留言里說(shuō)說(shuō)更想了解哪一方面的內(nèi)容安接。我會(huì)根據(jù)大家的意見來(lái)寫翔忽,