視訊解碼知識
純淨的視訊解碼流程
1.壓縮編碼資料->像素資料。
2.例如解碼H.264,就是“H.264碼流->YUV”。
一般的視訊解碼流程
1.視訊碼流一般存儲在一定的封裝格式(例如MP4、AVI等)中。封裝
格式中通常還包含音頻碼流等内容。
2.對于封裝格式中的視訊,需要先從封裝格式中提取中視訊碼流,然 後再進行解碼。
▫ 例如解碼MKV格式的視訊檔案,就是“MKV->H.264碼流->YUV”。
FFmpeg解碼函數簡介
av_register_all():注冊所有元件。
avformat_open_input():打開輸入視訊檔案。
avformat_find_stream_info():擷取視訊檔案資訊。
avcodec_find_decoder():查找解碼器。
avcodec_open2():打開解碼器。
av_read_frame():從輸入檔案讀取一幀壓縮資料。
avcodec_decode_video2():解碼一幀壓縮資料。
avcodec_close():關閉解碼器。
avformat_close_input():關閉輸入視訊文
相關學習資料推薦,點選下方連結免費報名,先碼住不迷路~】
【免費分享】音視訊學習資料包、大廠面試題、技術視訊和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點選加群免費領取~
FFmpeg解碼的資料結構
FFmpeg解碼的資料結構如下所示
FFmpeg資料結構簡介
AVFormatContext:
封裝格式上下文結構體,也是統領全局的結構體,儲存了視訊檔案 封裝 格式相關資訊。
AVInputFormat
每種封裝格式(例如FLV, MKV, MP4, AVI)對應一個該結構體。
AVStream
視訊檔案中每個視訊(音頻)流對應一個該結構體。
AVCodecContext
編碼器上下文結構體,儲存了視訊(音頻)編解碼相關資訊。
AVCodec
每種視訊(音頻)編解碼器(例如H.264解碼器)對應一個該結構體。
AVPacket
存儲一幀壓縮編碼資料。
AVFrame
存儲一幀解碼後像素(采樣)資料。
FFmpeg資料結構分析
AVFormatContext
iformat:輸入視訊的AVInputFormat
nb_streams :輸入視訊的AVStream 個數
streams :輸入視訊的AVStream []數組
duration :輸入視訊的時長(以微秒為機關)
bit_rate :輸入視訊的碼率
AVInputFormat
name:封裝格式名稱
long_name:封裝格式的長名稱
extensions:封裝格式的擴充名
id:封裝格式ID
一些封裝格式處理的接口函數
AVStream
id:序号
codec:該流對應的AVCodecContext time_base:該流的時基
r_frame_rate:該流的幀率
AVCodecContext
codec:編解碼器的AVCodec
width, height:圖像的寬高(隻針對視訊) pix_fmt:像素格式(隻針對視訊)
sample_rate:采樣率(隻針對音頻)
channels:聲道數(隻針對音頻)
sample_fmt:采樣格式(隻針對音頻)
AVCodec
name:編解碼器名稱
long_name:編解碼器長名稱 type:編解碼器類型
id:編解碼器ID
一些編解碼的接口函數
AVPacket
pts:顯示時間戳
dts :解碼時間戳
data :壓縮編碼資料
size :壓縮編碼資料大小
stream_index :所屬的AVStream
AVFrame
data:解碼後的圖像像素資料(音頻采樣資料)。
linesize:對視訊來說是圖像中一行像素的大小;對音頻來說是整個音 頻幀的大小。
width, height:圖像的寬高(隻針對視訊)。
key_frame:是否為關鍵幀(隻針對視訊) 。
pict_type:幀類型(隻針對視訊) 。例如I,P,B。
解碼後的資料為什麼要經過sws_scale()函數處理?
解碼後YUV格式的視訊像素資料儲存在AVFrame的data[0]、data[1]、 data[2]中。但是這些像素值并不是連續存儲的,每行有效像素之後存 儲了一些無效像素。以亮度Y資料為例,data[0]中一共包含了 linesize[0]*height個資料。但是出于優化等方面的考慮,linesize[0] 實際上并不等于寬度width,而是一個比寬度大一些的值。是以需要使 用sws_scale()進行轉換。轉換後去除了無效資料,width和linesize[0] 取值相等。
原文連結:FFMPEG - 視訊解碼器_ffmpeg解碼器名稱_别志華的部落格-CSDN部落格