一、FFmpeg 播放影片的基本流程整理
播放流程: video.avi(Container) -> 開啟得到 Video_Stream -> 讀取Packet -> 解析到 Frame -> 顯示Frame。
Container:在音影片中的容器,一般指的是一種特定的檔案格式(如 AVI/QT ),裡面指明瞭所包含的音影片,字幕等相關資訊。Stream:媒體流,指時間軸上的一段連續資料,如一段聲音、影片或字幕資料。Packet:Stream中的Raw資料,包含了可以被解碼成方便我們最後在應用程式中操作的幀的原始資料。Frame:Stream中的一個數據單元。Codec:編解碼器(Code 和 Decode),如 Divx和 MP3,以幀為單位實現壓縮資料和原始資料之間的相互轉換。二、FFmpeg 各個結構體及相關方法流程整理1. AVCodecAVCodec -- 編解碼器,採用連結串列維護,每一個都有其對應的名字、型別、CodecID和對資料進行處理的編解碼函式指標。
avcodec_find_decoder/avcodec_find_encoder :根據給定的codec id或解碼器名稱從系統中搜尋並返回一個AVCodec結構的指標avcodec_alloc_context3:根據 AVCodec 分配合適的 AVCodecContextavcodec_open/avcodec_open2/avcodec_close :根據給定的 AVCodec 開啟對應的Codec,並初始化 AVCodecContext/ 關閉Codecavcodec_alloc_frame:分配編解碼需要的 AVFrame 結構avcodec_decode_video/avcodec_decode_video2 :解碼一個影片幀,輸入資料在AVPacket結構中,輸出資料在AVFrame結構中avcodec_decode_audio4:解碼一個音訊幀。輸入資料在AVPacket結構中,輸出資料在AVFrame結構中avcodec_encode_video/avcodec_encode_video2 :編碼一個影片幀,輸入資料在AVFrame結構中,輸出資料在AVPacket結構中 2. AVCodecContextAVCodecContext -- 和具體媒體資料相關的編解碼器上下文,儲存AVCodec指標和與codec相關的資料,包含了流中所使用的關於編解碼器的所有資訊
codec_name[32]、codec_type(AVMediaType)、codec_id(CodecID)、codec_tag:編解碼器的名字、型別(音訊/影片/字幕等)、ID(H264/MPEG4等)、FOURC等資訊hight/width,coded_width/coded_height: Video的高寬sample_fmt:音訊的原始取樣格式, 是 SampleFormat 列舉time_base:採用分數(den/num)儲存了幀率的資訊3. AVFramedata/linesize:FFMpeg內部以平面的方式儲存原始影象資料,即將影象畫素分為多個平面(R/G/B或Y/U/V)陣列data陣列:其中的指標指向各個畫素平面的起始位置,編碼時需要使用者設定資料linesize陣列 :存放各個存貯各個平面的緩衝區的行寬,編碼時需要使用者設定資料key_frame:該影象是否是關鍵幀,由 libavcodec 設定pict_type:該影象的編碼型別:Intra(1)/Predicted(2)/Bi-dir(3) 等,預設值是 NONE(0),其值由libavcodec設定pts:呈現時間,編碼時由使用者設定quality:從1(最好)到FF_LAMBDA_MAX(256*128-1,最差),編碼時使用者設定,預設值是0nterlaced_frame:表明是否是隔行掃描的,編碼時使用者指定,預設04. AVFormatContextAVFormatContext -- 格式轉換過程中實現輸入和輸出功能、儲存相關資料的主要結構,描述了一個媒體檔案或媒體流的構成和基本資訊
nb_streams/streams :AVStream結構指標陣列, 包含了所有內嵌媒體流的描述,其內部有 AVInputFormat + AVOutputFormat 結構體,來表示輸入輸出的檔案格式avformat_open_input:建立並初始化部分值,但其他一些值(如 mux_rate、key 等)需要手工設定初始值,否則可能出現異常avformat_alloc_output_context2:根據檔案的輸出格式、副檔名或檔名等分配合適的 AVFormatContext 結構5. AVPacketAVPacket -- 暫存解碼之前的媒體資料(一個音/影片幀、一個字幕包等)及附加資訊(解碼時間戳、顯示時間戳、時長等),主要用於建立緩衝區並裝載資料。
data/size/pos: 資料緩衝區指標、長度和媒體流中的位元組偏移量flags:標誌域的組合,1(AV_PKT_FLAG_KEY)表示該資料是一個關鍵幀, 2(AV_PKT_FLAG_CORRUPT)表示該資料已經損壞destruct:釋放資料緩衝區的函式指標,其值可為 [av_destruct_packet]/av_destruct_packet_nofree, 會被 av_free_packet 呼叫6. AVStreamAVStream -- 描述一個媒體流,其大部分資訊可透過 avformat_open_input 根據檔案頭資訊確定,其他資訊可透過 avformat_find_stream_info 獲取,典型的有 影片流、中英文音訊流、中英文字幕流(Subtitle),可透過 av_new_stream、avformat_new_stream 等建立。
最新評論