測(cè)試?yán)?FFmpeg

一繁涂、FFmpeg的介紹和安裝

FFmpeg是什么?

FFmpeg是一套可以用來(lái)記錄二驰、轉(zhuǎn)換數(shù)字音頻扔罪、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序诸蚕。采用LGPL或GPL許可證步势。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案背犯。它包含了非常先進(jìn)的音頻/視頻編解碼庫(kù)libavcodec坏瘩,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開(kāi)發(fā)的漠魏。

FFmpeg在Linux平臺(tái)下開(kāi)發(fā)倔矾,但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows柱锹、Mac OS X等哪自。這個(gè)項(xiàng)目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負(fù)責(zé)維護(hù)禁熏。許多FFmpeg的開(kāi)發(fā)人員都來(lái)自MPlayer項(xiàng)目壤巷,而且當(dāng)前FFmpeg也是放在MPlayer項(xiàng)目組的服務(wù)器上。項(xiàng)目的名稱來(lái)自MPEG視頻編碼標(biāo)準(zhǔn)瞧毙,前面的"FF"代表"Fast Forward"胧华。

FFmpeg怎么安裝?

在官網(wǎng)下載安裝包宙彪,這里我們選擇最新的版本即可矩动,首先解壓安裝包

tar -xjvf ffmpeg-3.3.4.tar.bz2

cd ffmpeg-3.3.4/


執(zhí)行configure配置命令

./configure --enable-shared --prefix=/monchickey/ffmpeg

make

make install

這里有坑兒

執(zhí)行configure配置的話,可能會(huì)出現(xiàn)錯(cuò)誤:

yasm/nasm not found or too old. Use --disable-yasm for a crippled build.

If you think configure made a mistake, make sure you are using the latest

version from Git. If the Latest version fails, report the problem to the

f fmpeg-useraf fmpeg.org mailing list or IRC #ffmpeg on irc. freenode . net .

Include the Log file”config.log" produced by configure as this will help

solve the problem.

意思就是 yasm/nasm 包不存在或者很舊释漆,可以使用–disable-yasm禁用這個(gè)選項(xiàng)編譯或者可以安裝一下yasm

在官網(wǎng)下載最新的yasm安裝包

tar -xvzf yasm-1.3.0.tar.gz

cd yasm-1.3.0/

./configure

make

make install

編譯參數(shù)都是默認(rèn)的悲没,直接安裝到系統(tǒng)中即可

安裝FFmpeg

安裝成功之后繼續(xù)回到ffmpeg解壓后的目錄,執(zhí)行下面命令編譯并安裝

./configure --enable-shared --prefix=/monchickey/ffmpeg

make

make install

確認(rèn)安裝文件是否存在

make和make install會(huì)把ffmpeg相關(guān)執(zhí)行程序男图、頭文件示姿、lib庫(kù)安裝在/monchickey/ffmpeg/下

cd /monchickey/ffmpeg/查看一下發(fā)現(xiàn)有bin,include,lib,share這4個(gè)目錄:

? ? (1) bin是ffmpeg主程序二進(jìn)制目錄

? ? (2) include是C/C++頭文件目錄

? ? (3) lib是編譯好的庫(kù)文件目錄

? ? (4) share是文檔目錄

進(jìn)入bin甜橱,執(zhí)行命令

./ffmpeg -version

這里有坑兒

查看FFmpeg版本時(shí),可能會(huì)出現(xiàn)錯(cuò)誤:

libavdevice.so.57: cannot open shared object file: No such file or directory

遇到這個(gè)問(wèn)題不要慌栈戳,原因是lib目錄未加載到鏈接到系統(tǒng)庫(kù)中渗鬼。

如何解決

進(jìn)入/etc/ld.so.conf.d/目錄

vim? /etc/ld.so.conf.d/ffmpeg.conf

最后添加 /xxxx/ffmpeg/lib ,xxxx為自己的目錄

二荧琼、FFmpeg命令介紹

FFmpeg命令

查看文件信息

? ? ffmpeg -i input.mp4

? ? 我們?cè)谀玫揭曨l文件時(shí),可以通過(guò)這個(gè)命令看到視頻的碼率差牛,分辨率等信息

轉(zhuǎn)換編碼格式

? ? ? ffmpeg -i [input.file] -c:v libx264 output.mp4

? ? ? ffmpeg -i [input.file] -c:v libx265 output.mp4

視頻格式轉(zhuǎn)換

? ? ? ffmpeg -i out.mp4 -y out.avi

視頻轉(zhuǎn)Gif

? ? ? ffmpeg -i out.mp4 -y out.gif

? ? ? 從0開(kāi)始截10s轉(zhuǎn)Gif

? ? ? ffmpeg -i out.mp4 -ss 00:00:00 -t 10 -y out.gif

視頻轉(zhuǎn)多張圖片

每秒生成一個(gè)張圖片

? ? ? ffmpeg -i input_test.mp4 -vf fps=1 out%03d.png

每分鐘生成一張圖片

? ? ? ffmpeg -i input_test.mp4 -vf fps=1/60 out%03d.png

截取視頻中的某段視頻

? ? ? 截取從2s開(kāi)始10秒的視頻

? ? ? ffmpeg -ss 2 -i test.mp4 -t 10 -y -f out_test.mp4

視頻分片(把視頻切為一段一段)

? ? ? ffmpeg -i test.mp4 -c copy -map 0 -f segment -segment_time 10 video/part-%d.mp4

截取視頻中某個(gè)時(shí)間段的單張圖片或多張圖片

? ? ? ffmpeg -ss 2 -i test.mp4 -r 1 -t 2 -y -f image2 image-%3.jpeg

單張圖片或多張圖片轉(zhuǎn)視頻

? ? ? ffmpeg -loop 1 -i img%3d.png -t 10-y output.mp4

Gif轉(zhuǎn)視頻

? ? ? ffmpeg -i input.gif -y output.mp4

多個(gè)視頻合并

? ? ? ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4

修改視頻分辨率

? ? ? ffmpeg -i input_test.mp4 -s 320*240 out_test.mp4

給視頻添加音頻

? ? ffmpeg -i input.mp4 -i input1.mp3 -y output.mp4

提取視頻中的音頻

? ? ? ffmpeg -i test.mp4 -vn -a:c copy out.mp3

視頻靜音

? ? ? ffmpeg -i input.mp4 -an -vcodec copy output.mp4

音頻合并

? ? ffmpeg -i "concat:test1.mp3|test2.mp3" -acodec copy output.mp3

拼接視頻

? ? ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -c copy output.mp4

三命锄、附錄:FFmpeg的基本字符命令

-i 輸入文件的地址

-y 表示直接覆蓋已經(jīng)存在的輸出文件

-n 表示若某個(gè)輸出文件已經(jīng)存在則退出(若沒(méi)有設(shè)置-y或-n選項(xiàng),且某個(gè)輸出文件已經(jīng)存在ffmpeg會(huì)詢問(wèn)是否要覆蓋輸出文件)

-codec(-c) 指定輸入輸出的解碼編碼器 copy 則將輸入流直接復(fù)制到輸出流不進(jìn)行編解碼操作

-c:v 或-vcodec 可以為所有視頻流指定編碼器偏化,-c:v:1為第2個(gè)視頻流指定編解碼器脐恩。xvid(使用XVID編碼壓縮視頻,不能改的)

-c:a 或-acodec可以為所有音頻流指定編碼器侦讨,-c:a:12為第13個(gè)視頻流指定編解碼器驶冒。

-vol 音量

-ss 選項(xiàng)用于設(shè)置流的開(kāi)始時(shí)間,可以設(shè)置輸入輸出或者濾鏡韵卤。在開(kāi)始時(shí)間之前的幀將被跳過(guò)不被處理(輸入不被解碼骗污,輸出不被編碼,濾鏡不被處理)沈条。

例:ffmpeg -ss 2 -t 10 -i test.mp4 test.mov

時(shí)長(zhǎng)的格式:如-t 10, -t 23.167 時(shí)分秒: 如-t 10:23, -t 21:31:00.233

-s 設(shè)置幀的大小 例:ffmpeg -i test.mp4 -s 1080x680 out.mp4

-t 選項(xiàng)用于用于設(shè)置輸入輸出需忿,-t在-i前可以限制輸入時(shí)長(zhǎng),-t在輸出文件前可以限制輸出時(shí)長(zhǎng)

-to 選項(xiàng)類似于-t選項(xiàng)蜡歹,不同的是-to指定結(jié)束時(shí)刻屋厘,-t指定持續(xù)時(shí)間

-f 強(qiáng)制設(shè)置輸入輸出的文件格式,默認(rèn)情況下ffmpeg會(huì)根據(jù)文件后綴名判斷文件格式

-filter / -filter_complex 使用過(guò)濾器對(duì)流進(jìn)行處理 復(fù)雜過(guò)濾器

-vf 代替-filter:v處理視頻流

-b-b:a 指定音頻碼率月而。 b 是 bitrate的縮寫, a是 audio的縮寫

-b:v 指定視頻碼率汗洒。 b 是 bitrate的縮寫, v是 video的縮寫

-threads 設(shè)置處理線程數(shù) 例:ffmpeg -threads 8 -i test.mp4 out.mp4

-vframes 設(shè)置要輸出的視頻幀的數(shù)量: 例:ffmpeg -i test.mp4 -vframes 10 test.mov

-aframes 設(shè)置要輸出的音頻幀的數(shù)量。這是-frames:a的一個(gè)過(guò)時(shí)的別名父款。

-shortest 當(dāng)最短的輸入流結(jié)束后即停止編碼和輸出 例:ffmpeg -i bgm.mp3 -i test.mp4 -shortest output.mp4

-r 設(shè)置某個(gè)流的幀率按ffmpeg官方文檔說(shuō)-r與-framerate作用相同溢谤,但實(shí)際測(cè)試時(shí)發(fā)現(xiàn)不同。-framerate 用于限制輸入铛漓,而-r用于限制輸出 例:ffmpeg -i test.mp4 -r:v 30 test.mov

-aspect -aspect [:stream_specifier] 寬高比(輸出溯香,每個(gè)流) 設(shè)置方面指定的視頻顯示寬高比。aspect可以是浮點(diǎn)數(shù)字符串浓恶,也可以是num:den形式的字符串玫坛,其中num和den是寬高比的分子和分母。例如“4:3”包晰,“16:9”湿镀,“1.3333”和“1.7777”是有效的參數(shù)值炕吸。如果與-vcodec副本一起使用,則會(huì)影響存儲(chǔ)在容器級(jí)別的寬高比勉痴,但不會(huì)影響存儲(chǔ)在編碼幀中的寬高比(如果存在)赫模。

-vn 不將視頻流寫到輸出文件中無(wú)視頻的意思 例:ffmpeg -i test.mp4 -vn -a:c copy out.mp3

-an 不將音頻流寫到輸出文件中無(wú)音頻的意思 例:ffmpeg -i test.mp4 -v:c copy -an out.mp4

四、業(yè)務(wù)知識(shí)

關(guān)于音視頻需要了解的東西

音/視頻流

在音視頻領(lǐng)域蒸矛,我們把一路音/視頻稱為一路流瀑罗。如我們小時(shí)候經(jīng)常使用VCD看港片,在里邊可以選擇粵語(yǔ)或國(guó)語(yǔ)聲音雏掠,其實(shí)就是CD視頻文件中存放了兩路音頻流斩祭,用戶可以選擇其中一路進(jìn)行播放。

容器

我們熟悉的mp4,rmvb,mkv,avi是多媒體容器文件格式(或稱多媒體封裝格式)乡话,所謂容器是指將不同的數(shù)據(jù)流(視頻流摧玫,音頻流,字幕流等)封裝在一個(gè)文件(載體)中绑青。 播放時(shí)各種流分別進(jìn)行解碼等處理后诬像,然后輸出到顯示器和音響等設(shè)備進(jìn)行播放。多媒體容器格式不同于編碼格式闸婴,一個(gè)容器中可以封裝多種編碼格式的媒體流坏挠。 流封裝了實(shí)際的媒體數(shù)據(jù),如視頻流邪乍,音頻流和字幕流等癞揉。一般情況下,流中的數(shù)據(jù)只能使用一種編碼格式溺欧。

channel

是音頻中的概念喊熟,稱之為聲道。在一路音頻流中姐刁,可以有單聲道芥牌,雙聲道或立體聲。

幀率

幀率(frames per second, fps)是每秒畫面刷新的次數(shù)聂使,幀率越高視頻越流暢壁拉。一般來(lái)說(shuō)30fps就是可以接受的,60fps則可以明顯提升交互感和逼真感柏靶,但是一般超過(guò)75fps一般就不容易察覺(jué)到有明顯的流暢度提升了弃理。

分辨率

分辨率表示畫面的精細(xì)程度,通常用像素密度來(lái)表示屎蜓,常用的單位為ppi(像素每英寸)痘昌。通常像素密度越高畫面越精細(xì),模糊程度越低。對(duì)于視頻文件而言辆苔,像素密度是無(wú)法控制的(由播放器和顯示設(shè)備決定)算灸。我們通常用視頻的像素?cái)?shù)來(lái)表示它的分辨率如1080x640, 640x320等。

比特率

比特率(bit rate)又稱碼率驻啤,表示多媒體流每秒輸出的字節(jié)數(shù)菲驴,單位為KB/s,Kbps等。同樣的壓縮算法下骑冗,比特率越高音視頻的質(zhì)量越好赊瞬。

可變碼率(Variable Bitrate, VBR)

指的是編碼器的輸出碼率可以根據(jù)輸入源信號(hào)的復(fù)雜度進(jìn)行自適應(yīng)調(diào)整,以在輸出質(zhì)量保持不變的條件下盡可能減少數(shù)據(jù)量贼涩。VBR適用于存儲(chǔ)森逮,不太適用流式傳輸。

固定碼率(Constant Bitrate, CBR)

指的是編碼器輸出碼率固定磁携,CBR不適合存儲(chǔ),對(duì)于復(fù)雜內(nèi)容可能沒(méi)有足夠碼率進(jìn)行編碼良风,從而導(dǎo)致質(zhì)量下降谊迄,同時(shí)會(huì)在簡(jiǎn)單內(nèi)容部分浪費(fèi)一些碼率。

采樣率

每秒鐘對(duì)音頻信號(hào)的采樣次數(shù)烟央,采樣頻率越高聲音還原度越高统诺,聲音更加自然,單位是赫茲 Hz疑俭。音頻文件一般使用的采樣率是 44.1kHz粮呢,也就是一秒鐘采樣44100次,實(shí)驗(yàn)發(fā)現(xiàn)低于這個(gè)值就會(huì)有較明顯的損失钞艇,而高于這個(gè)值人的耳朵已經(jīng)很難分辨啄寡,而且增大了數(shù)字音頻所占用的空間。

視頻編碼

視頻流可以看做圖片的序列哩照,我們把這個(gè)序列中的一張圖片稱為一幀挺物。若存儲(chǔ)視頻中所有幀則會(huì)數(shù)據(jù)量過(guò)大,不便于存儲(chǔ)和傳輸飘弧。所幸統(tǒng)計(jì)表明大多數(shù)視頻相鄰幀之間的區(qū)別并不大识藤,所以對(duì)于一段變化不大的視頻,我們可以先完整編碼幀A次伶,其后的B幀只需要編碼與A幀不同的部分痴昧,B幀后的C幀則只編碼與B幀的差異。如此遞推冠王,將一段視頻編碼為一個(gè)序列赶撰。當(dāng)某個(gè)圖像與之前的圖像變化很大無(wú)法參考前面的幀來(lái)生成,我們就結(jié)束上一個(gè)序列將該幀完整編碼開(kāi)始一個(gè)新的序列。

H264是目前流行的一種視頻編碼算法扣囊,它定義了三種幀:完整編碼的I幀乎折,參考I幀生成只包含差異的P幀,以及以及參考前后幀編碼的B幀侵歇。

H264采用的核心算法是幀內(nèi)壓縮和幀間壓縮骂澄,幀內(nèi)壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法惕虑。通常坟冲,我們也把完整編碼的I幀稱為關(guān)鍵幀。因?yàn)榻獯a非關(guān)鍵幀需要解碼其參考的幀溃蔫,因此在截圖等不需要全部解碼的操作中健提,經(jīng)常截取關(guān)鍵幀以提升性能。

推薦比特率

阿里云給的建議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伟叛,一起剝皮案震驚了整個(gè)濱河市私痹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌统刮,老刑警劉巖紊遵,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異侥蒙,居然都是意外死亡暗膜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門鞭衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)学搜,“玉大人,你說(shuō)我怎么就攤上這事论衍∪鹋澹” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵坯台,是天一觀的道長(zhǎng)钉凌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捂人,這世上最難降的妖魔是什么御雕? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮滥搭,結(jié)果婚禮上酸纲,老公的妹妹穿的比我還像新娘。我一直安慰自己瑟匆,他們只是感情好闽坡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般疾嗅。 火紅的嫁衣襯著肌膚如雪外厂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天代承,我揣著相機(jī)與錄音汁蝶,去河邊找鬼。 笑死论悴,一個(gè)胖子當(dāng)著我的面吹牛掖棉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膀估,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼幔亥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了察纯?” 一聲冷哼從身側(cè)響起帕棉,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饼记,沒(méi)想到半個(gè)月后香伴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡握恳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捺僻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乡洼。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匕坯,靈堂內(nèi)的尸體忽然破棺而出束昵,到底是詐尸還是另有隱情,我是刑警寧澤葛峻,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布锹雏,位于F島的核電站,受9級(jí)特大地震影響术奖,放射性物質(zhì)發(fā)生泄漏礁遵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一采记、第九天 我趴在偏房一處隱蔽的房頂上張望佣耐。 院中可真熱鬧,春花似錦唧龄、人聲如沸兼砖。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讽挟。三九已至懒叛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耽梅,已是汗流浹背薛窥。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褐墅,地道東北人拆檬。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妥凳,于是被迫代替她去往敵國(guó)和親竟贯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344