最近在做一個(gè)手機(jī)app的后端,這個(gè)手機(jī)app有安卓和ios兩個(gè)版本主要面向的是國外用戶。app名字就不透露了,國內(nèi)外加起來有幾十萬的下載 量。這個(gè)手機(jī)app有一項(xiàng)功能是需要將app錄制的聲音加上幾幅圖片合成視頻,然后上傳到facebook網(wǎng)站上分享給好友觀看。本來這個(gè)功能是不需要后 端介入的,因?yàn)槭謾C(jī)上可以自己生成視頻并且搞定上傳就可以了。但由于: 1 android手機(jī)需要引入第三方的開源庫ffmpeg,導(dǎo)致手機(jī)app的安裝包大小會(huì)增大好幾M。 2. 在手機(jī)上保存生成視頻的資源文件圖片也會(huì)增加一定安裝包的大小。 3. android手機(jī)的配置五花八門,在一些配置較低的機(jī)型上完成合成視頻的工作非常吃力,效率很低。 基于這些考慮,就把這項(xiàng)工作移到后端來做。 說到多媒體的處理,我一般都用ffmpeg這個(gè)開源庫。這個(gè)庫有兩個(gè)特點(diǎn)。第一是功能很多,第二是支持的多媒體格式很全。這里需要感謝ffmpeg 的開源軟件工作者的辛勤工作和無私奉獻(xiàn)。創(chuàng)造了這么好的開源工具給我使用,為我的工作提供了便利。可以從下面的網(wǎng)址了解這個(gè)庫: ffmpeg開源庫的網(wǎng)址: http:/// ffmpeg下載網(wǎng)址:http:///download.html#releases ffmpeg文檔網(wǎng)址:http:///ffmpeg.html ffmpeg faq:http:///faq.html
初學(xué)者可以從這個(gè)faq開始學(xué)習(xí),因?yàn)檫@個(gè)faq講的東西非常具體又詳細(xì)。它介紹了ffmpeg的一些基本術(shù)語和簡(jiǎn)單用法。比如對(duì)于多段視頻的合并 這個(gè)功能,faq里的講解很仔細(xì)易懂。它講解了視頻合并分成幾種形式: 一種是多段視頻一段播放完之后再播放一段,這種叫concat。 第二種是將兩個(gè)視頻在同一個(gè)窗口里播放,類似畫中畫的效果。這種方式叫做overlay。 對(duì)于不同的方式都解釋了如何實(shí)現(xiàn)。
下面開始解釋我的工作。 首先,我的需求是要將一段音頻和幾張圖片合成一段視頻。這幾張圖片需要采用輪播的方式進(jìn)行循環(huán)的播放。 因此工作的第一步,我要知道這段音頻的播放時(shí)間有多長(zhǎng),然后我才能計(jì)算出圖片需要循環(huán)播放多少次。 用ffmpeg可以計(jì)算音頻的播放長(zhǎng)度,方法很簡(jiǎn)單直接運(yùn)行ffmpeg -i 文件名
輸出的結(jié)果的Duration就是robot.mp3的播放長(zhǎng)度,格式為 xx:xx:xx:xx, 單位是 “小時(shí):分鐘:秒:百分之一秒”。 通過加權(quán)想加即可得到播放的長(zhǎng)度。上文中例子的音頻長(zhǎng)度為11.78s。 工作的第二步是需要計(jì)算出整段視頻一共有多少幀。計(jì)算方法是: 總幀數(shù) = duration * fps 。 duration是第一步得到的音頻長(zhǎng)度,fps是視頻每秒的幀數(shù)。 工作第三步將所有的圖片文件拷貝到一個(gè)臨時(shí)目錄里,并通過循環(huán)的復(fù)制圖片制作出視頻的每一幀圖片。例如圖片的素材是image0.jpg image1.jpg image2.jpg, 需要拷貝到一個(gè)臨時(shí)文件夾,并臨時(shí)生成 image0000.jpg image0001.jpg image0002.jpg image0003.jpg image0004.jpg image0005.jpg 等等。 工作第四步就是要合成視頻了。可以通過ffmpeg對(duì)圖片和音頻文件進(jìn)行合并。進(jìn)行合并的方法為: 參數(shù)的解釋含義: -threads 2 以兩個(gè)線程進(jìn)行運(yùn)行, 加快處理的速度。 -y 對(duì)輸出文件進(jìn)行覆蓋 -r 10 fps設(shè)置為10幀/秒 -i /tmpdir/image%04d.jpg 輸入圖片文件,圖片文件保存為 image0001.jpg image0002.jpg .... -i audio.mp3 輸入的音頻文件 -absf aac_adtstoasc 將結(jié)果的音頻格式轉(zhuǎn)為faac格式時(shí)需要這個(gè)選項(xiàng)。將音頻格式轉(zhuǎn)為faac是因?yàn)樵趇phone上某些音頻格式的視頻無法播放,例如mp3. 但faac格式的音頻的視頻在iphone上可以播放。-absf 的意思是設(shè)置一個(gè)bitstream filter進(jìn)行某些轉(zhuǎn)換??梢杂胒fmpeg -bsfs 查看所有支持的bitstream filter。 bitstream filter和 aac_adtstoasc的具體含義我也說不上。但是如果不用這個(gè)選項(xiàng)又會(huì)導(dǎo)致轉(zhuǎn)換失敗。 |
|