一繁涂、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)鍵幀以提升性能。
推薦比特率
阿里云給的建議