直播入門(附錄一)FFmpeg關鍵類一覽表

關鍵類

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/oformatflags字段 被設置爲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,則表明所有的數據都被刷新到複用器中了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章