ffmpeg庫的介紹

1.引言

最近準(zhǔn)備學(xué)習(xí)使用ffmpeg庫寫一些音視頻方面的代碼。但是對這個(gè)庫的概念也好,用途也好不是十分的明確,故做一個(gè)筆記記錄下。

2.正題

FFmpeg:是領(lǐng)先的多媒體框架,能夠解碼、編碼、譯碼、復(fù)用器、解復(fù)用器、流、濾波和播放幾乎任何人類和機(jī)器產(chǎn)生的飲食頻。

它包括這樣的幾個(gè)庫:libavcodec,libavutil,libavformat,libavfilter,libavdevice,libswscale and libswresample。

libavcodec:提供了一個(gè)通用的編碼/解碼框架包含多種音解碼器和編碼器,視頻和字幕流,和幾個(gè)比特流過濾器。共享體系結(jié)構(gòu)提供了各種各樣的服務(wù),從比特流I/O到DSP優(yōu)化,使得它適合于實(shí)現(xiàn)健壯和快速的編解碼器,以及用于實(shí)驗(yàn)。

libformat:提供了視頻的復(fù)用和多路處理功能。實(shí)現(xiàn)了流媒體協(xié)議(udp、rtp、rtmp、rtsp等),媒體容器(mp4、AVI、Flv等)和基本的I/O訪問。rtp,rtcp等協(xié)議的詳細(xì)介紹

libavutil:是一個(gè)實(shí)用程序庫,以幫助便攜式多媒體編程。它包含了安全的移動(dòng)字符串函數(shù),隨機(jī)數(shù)生成器,數(shù)據(jù)結(jié)構(gòu),附加數(shù)學(xué)功能,加密和多媒體相關(guān)的功能(如枚舉的像素采樣格式)。它并不是libavcodec和libav必備的庫

libavdevice:抓取和繪制多種多媒體輸入/輸出設(shè)備提供了一個(gè)通用的框架,支持多種輸入和輸出設(shè)備,包括video4linux2 vfw dshow ALSA。

libavfilter:是一個(gè)通用的音視頻后處理庫。例如噪音處理

libswcale:執(zhí)行高度優(yōu)化的圖像縮放和顏色的像素格式轉(zhuǎn)換操作。
具體來說,這個(gè)庫執(zhí)行以下操作:
縮放:是改變視頻大小的過程。幾種縮放選項(xiàng)和算法都可以。這通常是一個(gè)有損過程。
像素格式轉(zhuǎn)換:是圖像的圖像格式和色彩空間轉(zhuǎn)換的過程,例如從平面yuv420p為RGB24包裝。它還處理包裝轉(zhuǎn)換,即從填充布局(所有屬于同一緩沖區(qū)內(nèi)的不同平面的像素)轉(zhuǎn)換為平面布局(所有屬于同一平面的樣本都存儲在專用緩沖區(qū)或“平面”)中。
這通常是在源和目標(biāo)顏色不同的有損壓縮。

libswresample:實(shí)現(xiàn)音頻的重采樣和混音,根據(jù)平臺做了優(yōu)化(neon等)。
該libswresample庫進(jìn)行高度優(yōu)化的音頻采樣,rematrixing和采樣格式轉(zhuǎn)換操作。
重采樣:是改變音頻速率,例如從44100Hz的高采樣率到8000Hz的過程。從高至低采樣率的音頻轉(zhuǎn)換是一種有損的過程。幾個(gè)重采樣選項(xiàng)和算法是可用的。
格式轉(zhuǎn)換:是將樣品的類型,例如從16位有符號的樣本為無符號的8位或浮樣品的過程。它還處理包裝的轉(zhuǎn)換,從包裝的布局傳遞時(shí),以平面布局(屬于交織在相同緩沖液不同的信道的所有樣品)(屬于存儲在專用緩沖區(qū)或“平面”相同的信道的所有樣品)。
Rematrixing:是改變頻道布局,例如從立體聲到單聲道的過程。當(dāng)輸入通道不能被映射到輸出數(shù)據(jù)流,該方法是有損耗的,因?yàn)樗婕暗讲煌脑鲆嬉蜃雍突旌稀?br> 其他各種音頻轉(zhuǎn)換(如拉伸和填充)通過專用的選項(xiàng)啟用。

視頻播放過程:
首先簡單介紹以下視頻文件的相關(guān)知識。我們平時(shí)看到的視頻文件有許多格式,比如 avi, mkv, rmvb, mov, mp4等等,這些被稱為容器Container), 不同的容器格式規(guī)定了其中音視頻數(shù)據(jù)的組織方式(也包括其他數(shù)據(jù),比如字幕等)。容器中一般會(huì)封裝有視頻和音頻軌,也稱為視頻流(stream)和音頻 流,播放視頻文件的第一步就是根據(jù)視頻文件的格式,解析(demux)出其中封裝的視頻流、音頻流以及字幕(如果有的話),解析的數(shù)據(jù)讀到包 (packet)中,每個(gè)包里保存的是視頻幀(frame)或音頻幀,然后分別對視頻幀和音頻幀調(diào)用相應(yīng)的解碼器(decoder)進(jìn)行解碼,比如使用 H.264編碼的視頻和MP3編碼的音頻,會(huì)相應(yīng)的調(diào)用H.264解碼器和MP3解碼器,解碼之后得到的就是原始的圖像(YUV or RGB)和聲音(PCM)數(shù)據(jù),然后根據(jù)同步好的時(shí)間將圖像顯示到屏幕上,將聲音輸出到聲卡,最終就是我們看到的視頻。
FFmpeg的API就是根據(jù)這個(gè)過程設(shè)計(jì)的,因此使用FFmpeg來處理視頻文件的方法非常直觀簡單。下面就一步一步介紹從視頻文件中解碼出圖片的過程。

yuv文件格式的介紹
YUV是被歐洲電視系統(tǒng)所采用的一種顏色編碼方法(屬于PAL),是PAL和SECAM模擬彩色電視制式采用的顏色空間。在現(xiàn)代彩色電視系統(tǒng)中,通常采用三管彩色攝影機(jī)或彩色CCD攝影機(jī)進(jìn)行取像,然后把取得的彩色圖像信號經(jīng)分色、分別放大校正后得到RGB,再經(jīng)過矩陣變換電路得到亮度信號Y和兩個(gè)色差信號B-Y(即U)、R-Y(即V),最后發(fā)送端將亮度和色差三個(gè)信號分別進(jìn)行編碼,用同一信道發(fā)送出去。這種色彩的表示方法就是所謂的YUV色彩空間表示。采用YUV色彩空間的重要性是它的亮度信號Y和色度信號U、V是分離的。

硬解碼和軟解碼:我們在計(jì)算機(jī)上播放的視頻文件都是經(jīng)過壓縮的,因?yàn)檫@樣有利于節(jié)約存儲空間;那么在播放過程,就需要進(jìn)行一個(gè)反射的解壓縮過程。在以前這項(xiàng)工作都是由CPU來完成的,對于普通分辨率的AVI、RMVB等文件,絕大多數(shù)的CPU都可以勝任;但是發(fā)展到高清視頻(1080i/p)之后,數(shù)據(jù)解壓縮的工作量比以前翻了數(shù)倍,這讓很多處理器叫苦不迭。
  隨著技術(shù)的發(fā)展,工程師們發(fā)現(xiàn)顯卡的GPU/VPU要比CPU更適合這類大數(shù)據(jù)量的、低難度的重復(fù)工作。視頻解碼工作從處理器那里分離出來,交給顯卡去做,這就叫做“硬解碼”,例如NVDIA的PureVideo、AMD的UVD技術(shù)等等;與之對應(yīng)的,以前那種純粹依靠CPU來講稿的方式則是“軟解碼”。不過受到技術(shù)條件的限制,純粹的“硬解碼”在現(xiàn)階段是不存在的,CPU依然在發(fā)揮一部分作用,只不過硬解碼時(shí)GPU/VPU已經(jīng)成為運(yùn)算的主力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容