第一部分
基礎(chǔ)術(shù)語(yǔ)
容器(Container)
容器就是一種文件格式炬藤,比如flv,mkv等碴里。包含下面5種流以及文件頭信息沈矿。
流(Stream)
是一種視頻數(shù)據(jù)信息的傳輸方式,5種流:音頻咬腋,視頻羹膳,字幕,附件根竿,數(shù)據(jù)陵像。
幀(Frame)
幀代表一幅靜止的圖像就珠,分為I幀,P幀醒颖,B幀妻怎。
編解碼器(Codec)
是對(duì)視頻進(jìn)行壓縮或者解壓縮,CODEC =COde (編碼) +DECode(解碼)
復(fù)用/解復(fù)用(mux/demux)
把不同的流按照某種容器的規(guī)則放入容器泞歉,這種行為叫做復(fù)用(mux)
把不同的流從某種容器中解析出來(lái)逼侦,這種行為叫做解復(fù)用(demux)
簡(jiǎn)介
FFmpeg的名稱來(lái)自MPEG視頻編碼標(biāo)準(zhǔn),前面的“FF”代表“Fast Forward”腰耙,F(xiàn)Fmpeg是一套可以用來(lái)記錄榛丢、轉(zhuǎn)換數(shù)字音頻、視頻挺庞,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序晰赞。可以輕易地實(shí)現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換选侨。
FFmpeg的用戶有Google掖鱼,F(xiàn)acebook,Youtube侵俗,優(yōu)酷锨用,愛(ài)奇藝,土豆等隘谣。
組成
1增拥、libavformat:用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)和讀取音視頻幀等功能寻歧,包含demuxers和muxer庫(kù)掌栅;
2、libavcodec:用于各種類型聲音/圖像編解碼码泛;
3猾封、libavutil:包含一些公共的工具函數(shù);
4噪珊、libswscale:用于視頻場(chǎng)景比例縮放晌缘、色彩映射轉(zhuǎn)換;
5痢站、libpostproc:用于后期效果處理磷箕;
6、ffmpeg:是一個(gè)命令行工具阵难,用來(lái)對(duì)視頻文件轉(zhuǎn)換格式岳枷,也支持對(duì)電視卡實(shí)時(shí)編碼;
7、ffsever:是一個(gè)HTTP多媒體實(shí)時(shí)廣播流服務(wù)器空繁,支持時(shí)光平移殿衰;
8、ffplay:是一個(gè)簡(jiǎn)單的播放器盛泡,使用ffmpeg 庫(kù)解析和解碼闷祥,通過(guò)SDL顯示;
FFmpeg處理流程
過(guò)濾器(Filter)
在多媒體處理中饭于,filter的意思是被編碼到輸出文件之前用來(lái)修改輸入文件內(nèi)容的一個(gè)軟件工具蜀踏。如:視頻翻轉(zhuǎn),旋轉(zhuǎn)掰吕,縮放等果覆。
語(yǔ)法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…
過(guò)濾器圖link label :是標(biāo)記過(guò)濾器的輸入或輸出的名稱
1.視頻過(guò)濾器 -vf
如testsrc視頻按順時(shí)針?lè)较蛐D(zhuǎn)90度
ffplay -f lavfi -i testsrc -vf transpose=1
如testsrc視頻水平翻轉(zhuǎn)(左右翻轉(zhuǎn))
ffplay -f lavfi -i testsrc -vf hflip
2.音頻過(guò)濾器 -af
實(shí)現(xiàn)慢速播放,聲音速度是原始速度的50%
ffplay p629100.mp3 -af atempo=0.5
如何實(shí)現(xiàn)順時(shí)針旋轉(zhuǎn)90度并水平翻轉(zhuǎn)殖熟?
過(guò)濾器鏈(Filterchain)
基本語(yǔ)法
Filterchain = 逗號(hào)分隔的一組filter
語(yǔ)法:“filter1,filter2,filter3,…filterN-2,filterN-1,filterN”
順時(shí)針旋轉(zhuǎn)90度并水平翻轉(zhuǎn)
ffplay -f lavfi -i testsrc -vf transpose=1,hflip
如何實(shí)現(xiàn)水平翻轉(zhuǎn)視頻和源視頻進(jìn)行比較局待? 看過(guò)濾器鏈?zhǔn)侨绾螌?shí)現(xiàn)的。
過(guò)濾器鏈(Filterchain)
第一步: 源視頻寬度擴(kuò)大兩倍菱属。
ffmpeg -i jidu.mp4 -t 10 -vf pad=2*iw output.mp4
第二步:源視頻水平翻轉(zhuǎn)
ffmpeg -i jidu.mp4 -t 10 -vf hflip output2.mp4
第三步:水平翻轉(zhuǎn)視頻覆蓋output.mp4
ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
是不是很復(fù)雜钳榨?
用帶有鏈接標(biāo)記的過(guò)濾器圖(Filtergraph)只需一條命令。
過(guò)濾器圖(Filtergraph)
基本語(yǔ)法
Filtergraph = 分號(hào)分隔的一組filterchain
“filterchain1;filterchain2;…filterchainN-1;filterchainN”
Filtergraph的分類
1纽门、簡(jiǎn)單(simple) 一對(duì)一
2薛耻、復(fù)雜(complex)多對(duì)一, 多對(duì)多
過(guò)濾器圖(Filtergraph)
簡(jiǎn)單過(guò)濾器圖處理流程和 復(fù)雜過(guò)濾器圖處理流程:
從圖中可以發(fā)現(xiàn)復(fù)雜過(guò)濾器圖比簡(jiǎn)單過(guò)濾器圖少2個(gè)步驟赏陵,效率比簡(jiǎn)單高饼齿,ffmpeg建議盡量使用復(fù)雜過(guò)濾器圖。
回答上面提的問(wèn)題蝙搔,實(shí)現(xiàn)水平翻轉(zhuǎn)視頻和源視頻進(jìn)行比較
過(guò)濾器圖(Filtergraph)
用ffplay直接觀看結(jié)果:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w
F1: split過(guò)濾器創(chuàng)建兩個(gè)輸入文件的拷貝并標(biāo)記為[a],[b]
F2: [a]作為pad過(guò)濾器的輸入缕溉,pad過(guò)濾器產(chǎn)生2倍寬度并輸出到[1].
F3: [b]作為hflip過(guò)濾器的輸入,vflip過(guò)濾器水平翻轉(zhuǎn)視頻并輸出到[2].
F4: 用overlay過(guò)濾器把 [2]覆蓋到[1]的旁邊.
選擇媒體流
一些多媒體容器比如AVI吃型,mkv证鸥,mp4等,可以包含不同種類的多個(gè)流勤晚,如何從容器中抽取各種流呢枉层?
語(yǔ)法:
-map file_number:stream_type[:stream_number]
這有一些特別流符號(hào)的說(shuō)明:
1、-map 0 選擇第一個(gè)文件的所有流
2赐写、-map i:v 從文件序號(hào)i(index)中獲取所有視頻流返干, -map i:a 獲取所有音頻流,-map i:s 獲取所有字幕流等等血淌。
3、特殊參數(shù)-an,-vn,-sn分別排除所有的音頻,視頻悠夯,字幕流癌淮。
注意:文件序號(hào)和流序號(hào)從0開(kāi)始計(jì)數(shù)。