視頻編解碼的理論和實踐2:Ffmpeg視頻編解碼

近幾年,視頻編解碼技術在理論及應用方面都取得了重大的進展,愈來愈多的人想要了解編解碼技術。所以,網易雲信研發工程師爲你們進行了概括梳理,從理論及實踐兩個方面簡單介紹視頻編解碼技術。segmentfault

相關閱讀推薦
《視頻直播關鍵技術:流暢、擁塞和延時追趕》
《視頻直播技術詳解:直播的推流調度》
《音視頻通話:小議音頻處理與壓縮技術》
《視頻編解碼的理論和實踐1:基礎知識介紹》框架

一、Ffmpeg介紹
《視頻編解碼的理論和實踐1:基礎知識介紹》介紹了視頻編碼的基礎知識,本篇文章,咱們一塊兒看看實際應用中的視頻編碼是如何操做的。
在實際工程項目中,ffmpeg是應用最多的多媒體處理框架,它提供了音視頻採集、編解碼、圖像處理,格式轉換等功能,而且擁有很強的擴展能力,經過ffmpeg能夠很容易集成第三方庫(例如:x26四、openh264等),經過這種能力,它能夠實現更強大的功能。Ffmpeg由下面幾個部分構成:
Libavformat:音視頻格式處理
Libavcodec:音視頻編解碼
Libavfilter:音視頻濾鏡
Libavdevice:音視頻設備採集
Libswscale:圖像縮放、轉換
Libswresample:音頻重採樣
Ffmpeg:一個命令行的轉碼工具
Ffplay:一個命令行播放器
Ffprobe:簡單的媒體格式分析工具ide

二、Ffmpeg視頻編碼
視頻編碼是ffmpeg提供的基本功能之一,經過ffmpeg能夠很容易實現視頻編碼操做。使用ffmpeg進行視頻編碼以前須要把x26四、openh264等第三方編解碼庫集成到ffmpeg中才能使用。編碼步驟以下:
(1) 註冊編碼器
(2) 根據名字或者ID查找你想使用的編碼器(例如x26四、x26五、openh264等)
(3) 建立一個編碼器上下文對象
(4) 在編碼器上下文對象中設置編碼器參數
(5) 打開編碼器
(6) 讀取一幀圖像進行編碼,一直重複該過程,直處處理結束
(7) 關閉編碼器
示例代碼以下:
avcodec_register_all(); // 註冊全部可用的編碼器
codec = avcodec_find_encoder_by_name(「libx264」); // 查找編碼器
ctx = avcodec_alloc_context3(codec); // 建立編碼器上下文
ctx->width = 1280; // 設置編碼器參數
ctx->height = 720;
// ….其餘的參數設置
avcodec_open2(ctx, codec, NULL); // 打開編碼器
while(read_frame(frame)){函數

AVPacket pkt; // 存放編碼以後的數據
int got_output = 0; // 是否成功編碼獲得一個圖像
avcodec_encode_video2(ctx, &pkt, frame, &got_output); // 編碼
if(got_output){
    // 獲得編碼後的數據,進行後續操做

}
}
avcodec_free_context(&ctx); // 關閉編碼器工具

能夠看到,ffmpeg隱藏了大部分的編碼細節,調用者不須要了解預測、變換、量化、熵編碼等細節,這些細節都已經被ffmpeg封裝好了,開發者只要把編碼參數設置好,而後調用相關的接口函數,便可實現視頻編碼功能。固然,這知識最基本的編碼功能,要想在畫面質量和壓縮率之間取得平衡,必須瞭解視頻編碼的細節,而後設置相應的參數。編碼

三、Ffmpeg視頻解碼
Ffmpeg自帶了H264的視頻解碼器,開發者可選擇直接使用ffmpeg自帶的H264解碼器或者第三方的解碼庫進行視頻解碼。和視頻編碼同樣,解碼操做的大部分細節都已經被ffmpeg隱藏起來了,開發者只須要設置好相關的解碼參數,而後調用接口函數就能夠實現解碼功了。解碼流程以下:
(1) 註冊解碼器
(2) 查找解碼器
(3) 建立解碼器上下文對象
(4) 設置解碼參數
(5) 打開解碼器
(6) 讀取數據進行解碼,直到結束
(7) 關閉解碼器
代碼示例以下:
avcodec_register_all(); //註冊解碼器
codec = avcodec_find_decoder_by_name(「h264」); // 查找解碼器
ctx = avcodec_alloc_context3(codec); // 建立解碼器上下文對象
//…設置解碼參數
avcodec_open2(ctx, codec, NULL); // 打開解碼器
while(read_packet(pkt)){命令行

AVFrame frame; // 存放解碼以後的圖像數據
int got_frame = 0;
avcodec_decode_video2(ctx, frame, &got_frame, pkt); // 解碼
if(got_frame){
    // 解碼獲得一幀圖像,進行後續操做…
}

}
avcodec_free_context(&ctx); // 關閉解碼器code

能夠看到ffmpeg是個很是強大的多媒體處理框架,經過ffmpeg咱們能夠很容易進行音視頻方面的處理。上面介紹的只是ffmpeg的冰山一角,要想熟練使用ffmpeg,必須花不少時間去熟練使用它。orm

更多即時通信、音視頻技術的乾貨文章,請關注網易雲信博客視頻

相關文章
相關標籤/搜索