利用FFmpeg制作视频序列
前言
本文介紹了利用FFmpeg進(jìn)行視頻測(cè)試序列制作的方法。所謂測(cè)試序列就是將若干個(gè)不同場(chǎng)景的視頻片段,按照不同的分辨率、碼率、編碼方法等進(jìn)行處理,然后拼接成一條長(zhǎng)視頻,供測(cè)試者打分。一般包括以下幾個(gè)步驟:視頻截取、采樣/編碼/轉(zhuǎn)碼、黑幀/灰?guī)谱鳌⒁曨l拼接、視音頻融合等。
- 前言
- 一視頻截取
- 二采樣和編碼
- 三黑幀灰?guī)闹谱?/li>
- 四視頻拼接
- 1 先音視頻片段融合再拼接
- 2 先視音頻片段分別拼接得到長(zhǎng)視頻和長(zhǎng)音頻再將二者融合
- 后記
一、視頻截取
截取視頻之前,一般要先獲取原始高清視頻,可以到Y(jié)outube、Gopro等網(wǎng)站下載,商用的話請(qǐng)注意版權(quán)問(wèn)題,或者可以自己錄制視頻。然后瀏覽獲取到的視頻,確定要截取的片段后,可利用FFmpeg截取。比如要截取名為input.mp4的視頻1分20秒至1分40秒的片段,命令如下:
ffmpeg -i %input_path%\input.mp4 -ss 00:01:20 -t 00:00:20 %output_path%\output.mp4上述命令中,-i為輸入的文件,-ss 即為起始時(shí)間,-t為截取長(zhǎng)度,這兩個(gè)時(shí)間可以用 hh:mm:ss 的格式,也可以直接用秒,如 00:01:20 可寫(xiě)成 80。另外,時(shí)間還可以精確到毫秒級(jí),比如可以截取20.358秒的長(zhǎng)度,雖然實(shí)際截出來(lái)不會(huì)那么精確。
二、采樣和編碼
截取出來(lái)的視頻片段,若想重新編碼到其他分辨率、碼率的話,一般要先轉(zhuǎn)為YUV格式(此后會(huì)丟失音頻,因?yàn)閥uv不存儲(chǔ)音頻),因?yàn)閅UV格式是把每一幀的圖像用亮度和色度分開(kāi)表示的格式,所以壓縮時(shí)容易去掉色度的數(shù)據(jù);之后將原始yuv采樣到目標(biāo)分辨率,接著對(duì)yuv進(jìn)行x264編碼得到.264文件,最后將.264文件封裝成MP4等格式。各步驟命令大致如下:
MP4轉(zhuǎn)YUV:
對(duì)YUV采樣(假設(shè)原始分辨率為3840x1920,目標(biāo)分辨率為1920x960):
ffmpeg -s 3840x1920 -i %input_path%\input_3840x1920.yuv -s 1920x960 %output_path%\output_1920x960.yuv其中-s依次為原始分辨率和目標(biāo)分辨率。
對(duì)采樣后的YUV進(jìn)行x264編碼(應(yīng)先下載x264源碼編譯得到x264.exe):
.264文件封裝為MP4:
ffmpeg -i %input_path%\input.264 %output_path%\output.mp4至此,可將各視頻素材編碼到目標(biāo)分辨率和碼率。編碼器可替換成其他,x264是我本次項(xiàng)目用的。
%input_path%\gray_3840x1920.ts -s 1920x960 -vcodec copy %output_path%\gray_1920x960.ts
其中,-s是目標(biāo)分辨率,-vcodec copy 意為使用原視頻的編碼方式,一般不更改編碼方式的話,都最好附上這個(gè)參數(shù),能夠避免不少意外。去掉-vcodec copy 也能轉(zhuǎn)分辨率,輸出的文件也能正常播放,但拿去拼接的時(shí)候會(huì)出錯(cuò)。
四、視頻拼接
用來(lái)拼接到同一序列的視頻片段們,分辨率最好是一樣的,幀率不必一樣,碼率隨意。ffmpeg拼接視頻之前,需要把視頻轉(zhuǎn)為.ts格式。拼接有兩條思路:一是先將個(gè)視頻片段與其對(duì)應(yīng)的音頻融合再拼接,二是將視頻片段和音頻片段分別拼接,再將得到的長(zhǎng)視頻序列和長(zhǎng)音頻序列融合。
4.1 先音視頻片段融合再拼接
先從截取得到的有聲MP4視頻片段中提取音頻:
ffmpeg -i input.mp4 -vn -acodec copy output.aac其中,-vn意為屏蔽視頻信息,只獲取音頻;-acodec copy意為復(fù)制原音頻的編碼方式。(ps,若要提取視頻,命令為:ffmpeg -i input.mp4 -an -vcodec copy output.mp4 )
接著將音視頻片段融合產(chǎn)生可用來(lái)拼接的.ts文件:
最后,將前面得到的有聲ts視頻和灰?guī)瑃s視頻 gray.ts 拼接成一條長(zhǎng)視頻:
ffmpeg -i "concat:%path1%\video1.ts|%gray_path%\gray.ts|%path2%\video2.ts|%gray_path%\gray.ts|... ...|%pathN%\videoN.ts|%gray_path%\gray.ts" -vcodec copy -acodec copy -bsf:a aac_adtstoasc %output_path%\output.mp4其中,-vcodec copy 意為復(fù)制原視頻編碼方式, -acodec copy 意為復(fù)制原音頻編碼方式,-bsf:a aac_adtstoasc 是一個(gè)bitstream filter,不加的話,會(huì)提示無(wú)法音視頻融合。
至此,一個(gè)有聲的視頻測(cè)試序列就完成了!
4.2 先視音頻片段分別拼接得到長(zhǎng)視頻和長(zhǎng)音頻,再將二者融合
視頻片段拼接:
ffmpeg -i "concat:%path1%\video1.ts|%gray_path%\gray.ts|%path2%\video2.ts|%gray_path%\gray.ts|... ...|%pathN%\videoN.ts|%gray_path%\gray.ts" -vcodec copy %output_path%\output.mp4在進(jìn)行音頻片段拼接之前,需要先獲取靜音音頻,時(shí)長(zhǎng)等于灰?guī)瑫r(shí)長(zhǎng)。一般可以用軟件產(chǎn)生,比如用cool edit pro,產(chǎn)生靜音pcm,然后把pcm轉(zhuǎn)為aac。FFmpeg也能完成音頻拼接,命令格式和視頻拼接相似,但是在我的實(shí)驗(yàn)過(guò)程中,ffmpeg拼接出來(lái)的長(zhǎng)音頻會(huì)比各音頻片段相加的總和還長(zhǎng),總長(zhǎng)度為15分鐘整的音頻片段們,拼接后長(zhǎng)度為15分8秒!和視頻融合后,音視頻嚴(yán)重不同步。所以我后來(lái)使用的是另一個(gè)軟件:音頻編輯專家。效果良好,而且能自動(dòng)統(tǒng)一各片段的音量,很不錯(cuò)的功能。
之后長(zhǎng)視頻和長(zhǎng)音頻融合,可以使用ffmpeg實(shí)現(xiàn):
也可以使用MP4box實(shí)現(xiàn),軟件 YAMB 中有交互界面可以方便高效地實(shí)現(xiàn)。這個(gè)軟件的其他功能也相當(dāng)實(shí)用。
在上述兩種拼接方法中,第一種方法的優(yōu)點(diǎn)是音視頻同步非常好,而且只需拼接一次,比較省事。第二種方法的好處是思路簡(jiǎn)單,成功率高。我是在嘗試第一種方法失敗,而且折騰數(shù)日無(wú)果后,才退而求其次采用第二種方法。不過(guò)現(xiàn)在想來(lái)應(yīng)該是我當(dāng)時(shí)使用的黑幀視頻質(zhì)量太差,或者是黑幀轉(zhuǎn)分辨率編碼時(shí)沒(méi)加上-vcodec copy之類的參數(shù)。我實(shí)驗(yàn)室的師姐向來(lái)都用的第一種方法,一直沒(méi)什么問(wèn)題。
后記
我是在研二師兄師姐們忙于找工作,無(wú)暇兼顧項(xiàng)目工作之時(shí),接手了這個(gè)任務(wù)。此時(shí)的我本科剛畢業(yè),對(duì)批處理只有朦朧印象,對(duì)視頻編碼也知之甚少,對(duì)FFmpeg則是一無(wú)所知。一周左右的時(shí)間里,我匆忙學(xué)習(xí)了批處理,照著前人的實(shí)現(xiàn)方法寫(xiě)批處理文件調(diào)用ffmpeg去實(shí)現(xiàn)。遇到許多問(wèn)題,有些原始MP4文件頭無(wú)法被FFmpeg識(shí)別,截取不了;有個(gè)別YUV文件無(wú)法使用ffmpeg進(jìn)行下采樣;轉(zhuǎn)碼后視頻長(zhǎng)度變化;來(lái)自于同一片段的音視頻長(zhǎng)度不相等;拼接后音視頻不同步,等。嘗遍了各種失敗的方法,個(gè)中艱苦,非三言兩語(yǔ)所能道明。不過(guò)現(xiàn)在想來(lái),覺(jué)得幾天前的自己太傻,這么簡(jiǎn)單的任務(wù)應(yīng)該兩天能做完。這大概也是一種進(jìn)步吧,快樂(lè)。細(xì)心很重要,批處理簡(jiǎn)單實(shí)用,FFmpeg極其強(qiáng)大。
總結(jié)
以上是生活随笔為你收集整理的利用FFmpeg制作视频序列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Jetson TX1 学习1 GPIO
- 下一篇: 基于stm32的遥控小船(一)L298N