關鍵類
AVFormatContext
- 定義
這裏只給出源碼的路徑libavformat/avformat.h
- 簡介
FFmpeg將各種封裝格式通過在這個結構體進行抽象。這個結構體在解封裝中扮演者穿針引線的作用,通過這個結構體,可以將編碼後的數據分裝成FLV,MP4,AVI等格式。創建這個結構體不能通過簡單的mallloc或者new來創建,需要通過函數avformat_alloc_context
來創建,否則會出錯。 - 關鍵變量
-
- iformat 和 oformat
struct AVInputFormat *iformat;
struct AVOutputFormat *oformat;
主要是用來複用和解複用的。
-
- pb
AVIOContext *pb;
有關I/O的上下文結構體,這個變量要用戶手動釋放,除非iformat/oformat
的flags
字段 被設置爲AVFMT_NOFILE
。給一個釋放的參考代碼
if (outputContext->oformat->flags & AVFMT_NOFILE)
{
avio_close(m_outputContext->pb);
}
avformat_free_context(m_outputContext);
-
- nb_streams 和 streams
unsigned int nb_streams;
AVStream **streams;
nb_streams 表示音視頻流的個數,streams則是音頻流的數據,數組大小爲nb_streams 。需要注意的是,要操作這兩個變量只能通過avformat_new_stream
函數來增加,通過avformat_free_context
函數來釋放。
這裏給個使用的例子。
for (int index = 0; index < nb_streams; ++index)
{
handle(streams[index])
}
-
- filename 和 url
char filename[1024]; // 棄用了
char *url;
首先filename
字段已經被棄用了,轉而使用了url字段來存儲輸入或者輸出的文件或url。相比filename字段,url沒有長度的限制。
-
- start_time 和 duration
int64_t start_time;
int64_t duration;
start_time是第一幀時間戳,duration是整個流的時長。需要注意的是這兩個變量的單位都是微秒(us),而不是秒(s)。start_time會由ffmpeg自動推導出來,不用手動設置。
-
- bit_rate
int64_t bit_rate
整個流的比特率,這個值ffmpeg會自動設置,不需要手動設置。
AVInputFormat
- 定義
這裏只給出源碼的路徑libavformat/avformat.h
- 簡介
AVInputFormat 通過一系列的函數指針,實現了各種不同文件操作。從名字就可以看出來,該結構體主要是用來處理輸入流的。
通過調用av_register_all(),FFmpeg會將所有可用的解複用器保存在以first_iformat爲頭,last_iformat爲尾的鏈表。 - 關鍵變量
-
- name 、long_name 和 extensions
const char *name;
const char *long_name;
const char *extensions;
name是一個格式名稱,long_name則是這個格式的補充說明,類似於備註。extensions很好理解,就是文件拓展名。
-
- read_header
int (*read_header)(struct AVFormatContext *);
函數指針類型的字段。讀取格式頭部並初始化AVFormatContext結構體。如果成功,返回0。創建新的流需要調用avformat_new_stream
函數
-
- read_packet
int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
函數指針類型的字段。從上下文中(第一個參數)讀取一個數據包,並將內容填充到pkt中。與此同時,pts和flag也會被設置危險相應的值。
-
- read_close
int (*read_close)(struct AVFormatContext *);
函數指針類型的字段。關閉一條讀取流,但是AVFormatContext和AVStreams的空間並不會釋放。
AVOutputFormat
- 定義
這裏只給出源碼的路徑libavformat/avformat.h
- 簡介
AVOutputFormat跟AVInputFormat非常類似,也是通過一系列的函數指針,實現了各種不同文件操作。該結構體主要是用來處理輸出的。 - 關鍵變量
-
- name 、long_name 和 extensions
const char *name;
const char *long_name;
const char *extensions;
name是一個格式名稱,long_name則是這個格式的補充說明,類似於備註。extensions很好理解,就是文件拓展名。
-
- audio_codec,video_codec和subtitle_codec
enum AVCodecID audio_codec; /**< default audio codec */
enum AVCodecID video_codec; /**< default video codec */
enum AVCodecID subtitle_codec; /**< default subtitle codec */
音視頻和字幕的編碼格式指定,這裏都是用默認的編碼格式的。
-
- write_header
int (*write_header)(struct AVFormatContext *);
將對應格式的頭部寫到輸出流中,比如FLV格式的頭部信息。
-
- write_packet
int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
將一個數據包寫入到輸出流中。如果flag
字段設置了AVFMT_ALLOW_FLUSH
標誌,pkt變量則可以爲NULL,此時則表明要刷新數據到複用器中。當執行了刷新操作,如果這個函數返回0,則表示還有數據待刷新,如果返回爲1,則表明所有的數據都被刷新到複用器中了。