FFmpeg編解碼技術(shù)被廣泛應(yīng)用于直播或點播應(yīng)用碧浊,網(wǎng)上有很多相關(guān)的資料撩幽,這些資料有的其實已經(jīng)很詳盡了,但是對于一些剛?cè)胄械男“讈碚f看起來比較費時膏孟。近來有空,我就整合一下網(wǎng)上的資料拌汇,結(jié)合自己的經(jīng)驗骆莹,給大家做一個簡單易懂的介紹。
首先我們來看一下編解碼中常用到的結(jié)構(gòu)體:
AVFormatContext:貫穿全局的基本結(jié)構(gòu)體担猛。主要用于音視頻格式方面的處理。
AVStream:音頻流信息
AVCodecContext:描述編解碼器上下文的數(shù)據(jù)結(jié)構(gòu)丢氢,包含了眾多編解碼器需要的參數(shù)信息
AVFrame:存儲非壓縮的數(shù)據(jù)(視頻對應(yīng)RGB/YUV像素數(shù)據(jù)傅联,音頻對應(yīng)PCM采樣數(shù)據(jù))
AVPacket:存儲壓縮數(shù)據(jù)(視頻對應(yīng)H.264等碼流數(shù)據(jù),音頻對應(yīng)AAC/MP3等碼流數(shù)據(jù))
AVPicture:保存RGB圖片信息
下面講一下如何進(jìn)行拉流并且進(jìn)行解碼
首先疚察,弄清楚整個流程蒸走,有助于我們理解,大致流程如下
FFmpeg解碼流程
//注冊所有的編解碼器
avcodec_register_all();
//初始化格式及傳輸協(xié)議
av_register_all();
//初始化全局網(wǎng)絡(luò)組件
avformat_network_init();
//根據(jù)URL打開一個輸入流或local視頻文件并讀取頭部信息
avformat_open_input()
//檢索視頻流信息
avformat_find_stream_info()
//獲取視頻編碼格式
avcodec_find_decoder()
//根據(jù)上面的視頻格式打開編解碼器
avcodec_open2()
讀取數(shù)據(jù)
av_read_frame()
//將該幀解碼貌嫡,將h264(packet)解碼成YUV(pFrame)
avcodec_decode_video2()
//yuv420p 轉(zhuǎn)換成 rgb24
sws_scale()
解碼的流程基本就這樣比驻,看完上文后,應(yīng)該對解碼有一定的了解岛抄。我根據(jù)自己的經(jīng)驗及網(wǎng)上資料寫了個DEMO别惦。項目里面對代碼的注釋非常的詳細(xì),特別容易理解夫椭。