天天看點

FFMPEG - 視訊解碼器

作者:音視訊流媒體技術

視訊解碼知識

純淨的視訊解碼流程

1.壓縮編碼資料->像素資料。

2.例如解碼H.264,就是“H.264碼流->YUV”。

一般的視訊解碼流程

1.視訊碼流一般存儲在一定的封裝格式(例如MP4、AVI等)中。封裝

格式中通常還包含音頻碼流等内容。

2.對于封裝格式中的視訊,需要先從封裝格式中提取中視訊碼流,然 後再進行解碼。

▫ 例如解碼MKV格式的視訊檔案,就是“MKV->H.264碼流->YUV”。

FFMPEG - 視訊解碼器

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解碼的資料結構如下所示

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 - 視訊解碼器_ffmpeg解碼器名稱_别志華的部落格-CSDN部落格

繼續閱讀