Muxer 視音頻復用器
數據結構
AVCodecContext
AVFormateContext
AVFormatContext是API中直接接觸到的結構體,位於avformat.h中,是音視頻數據,也就是音視頻文件(通常接觸到的mp3/mp4等文件)的一種抽象和封裝,該文件中包含了多路流,包括音頻流、視頻流、字幕流等。該結構體的使用,貫穿了ffmpeg使用的整個流程。
包含了媒體流的格式信息,比較重要的有:
AVInputFormat或者AVOutputFormat:只能同時存在一個。
AVStream
AVPacket
title、author、copyright、duration、start_time、bit_rate等。
(參考文檔【5】)
AVStream
AVStream在FFmpeg使用過程中關於編解碼至關重要的結構體之一,是對流(Stream)的封裝和抽象,描述了視頻、音頻等流的編碼格式等基本流信息。此外也是音頻、視頻、字幕數據流的重要載體。
對於一個典型的mp4格式的媒體源(H264)來說,需要經過解封裝(解復用),解碼然后輸出的過程。而解封裝從容器中分離出來的流,在FFmpeg中對應的對象就是AVStream。解復用解出來幾條AVStream,就會在AVFormateContext中的nb_streams+1(總流數+1),並且將AVStream保存在streams數組中。(參考文檔【4】)
PTS:Presentation Time Stamp。PTS主要用於度量解碼后的視頻幀什么時候被顯示出來
DTS:Decode Time Stamp。DTS主要是標識讀入內存中的bit流在什么時候開始送入解碼器中進行解碼
time_base:時間基。它也是用來度量時間的。
如果把1秒分為25等份,你可以理解就是一把尺,那么每一格表示的就是1/25秒。此時的time_base={1,25}
如果你是把1秒分成90000份,每一個刻度就是1/90000秒,此時的time_base={1,90000}。
參考文檔:
【1】最簡單的基於FFmpeg的封裝格式處理:視音頻復用器(muxer) 2014-10-09 雷霄驊
【2】新版本ffmpeg源碼簡單分析:avformat_alloc_output_context2() 2018-12-13 對着天說晚安
【3】avformat_new_stream,傳入AVCodec導致的內存泄露(av_mallocz) 2018-04-21 指縫間的風袁
【4】FFmpeg:AVStream結構體分析 2018-05-28 SuperDali
【5】FFmpeg:AVFormatContext結構體分析 2018-05-27 SuperDali
【6】音視頻開發第一篇——音視頻基礎概念。 2018-04-26 SuperDali
【7】FFmpeg源代碼簡單分析:avio_open2() 2015-03-04 雷霄驊
【8】深入理解pts,dts,time_base 2017-12-11 bixinwei
【9】RTSP再學習 -- 利用FFmpeg 將 rtsp 獲取H264裸流並保存到文件中 2017-10-12 聚優致成
【10】ffmpeg中的時間戳與時間基 2018-09-25 李超
尾巴:
26歲雷霄驊先生於16年步入天堂。他留下的ffmpeg教程詳細清晰,給我的學習帶來很大幫助。雖然人已經不在,但留下的知識至今依舊散發出它的光芒。在此感謝雷霄驊先生分享他的知識。願“過勞死”遠離天下的工程師們。