FFMPEG解封裝函數(shù)
使用FFmpeg對音視頻流進行解封裝是處理音視頻輸入的初始步驟,F(xiàn)Fmpeg提供了豐富的接口函數(shù)進行該操作,下面對一些重要函數(shù)功能進行詳細介紹。
基本函數(shù)介紹
av_register_all()
函數(shù)原型:
函數(shù)功能:
初始化所有組件,在函數(shù)內(nèi)部會對編解碼器和復(fù)用器進行注冊。
avformat_network_init()
函數(shù)原型:
函數(shù)功能:
加載socket庫以及網(wǎng)絡(luò)加密協(xié)議相關(guān)的庫,為后續(xù)使用網(wǎng)絡(luò)相關(guān)功能提供支持
avformat_open_input()
函數(shù)原型:
函數(shù)功能:
用于打開多媒體數(shù)據(jù)并且獲取相關(guān)信息
參數(shù)說明:
AVFormatContext **ps
:函數(shù)如果調(diào)用成功,會將獲取到的音視頻信息存入AVFormatContext結(jié)構(gòu)體ps中。
const char *filename
:打開的音視頻流的URL。
AVInputFormat *fmt
:可以強制指定AVFormatContext中的AVInputFormat。該參數(shù)一般情況都設(shè)置為NULL,表示FFmpeg可以自動檢測AVInputFormat。
AVDictionary **options
:附件的一些選項,一般也設(shè)置為NULL。
返回值:
調(diào)用成功返回值>=0
avformat_find_stream_info()
函數(shù)原型:
函數(shù)功能:
讀取一部分音視頻數(shù)據(jù)并由此獲得一些該視頻的相關(guān)信息。
參數(shù)說明:
AVFormatContext *ic
:將獲取到的流信息存入ic中供后續(xù)使用。
const char *filename
:打開的音視頻流的URL。
AVInputFormat *fmt
:可以強制指定AVFormatContext中的AVInputFormat。該參數(shù)一般情況都設(shè)置為NULL,表示FFmpeg可以自動檢測AVInputFormat。
AVDictionary **options
:附件的一些選項,一般也設(shè)置為NULL。
返回值:
調(diào)用成功返回值>=0
avformat_find_stream_info()
函數(shù)原型:
函數(shù)功能:
讀取一部分音視頻數(shù)據(jù)并由此獲得一些該視頻的相關(guān)信息。
參數(shù)說明:
AVFormatContext *ic
:將獲取到的流信息存入ic中供后續(xù)使用。
AVDictionary **options
:額外的選項,一般設(shè)置為0。
返回值:
調(diào)用成功返回值>=0
av_find_best_stream()
函數(shù)原型:
函數(shù)功能:
用于獲取音頻流、視頻流索引。
參數(shù)說明:
AVFormatContext* ic
:獲取到的AVFormatContext。enum AVMediaType type
:輸入對應(yīng)要尋找的具體類型流信息(音頻、視頻)。int wanted_stream_nb
:一般設(shè)置為-1。related_stream
:一般設(shè)置為-1。AVCodec** decoder_ret
:一般設(shè)置為NULL。int flags
:一般設(shè)置為0。
返回值:
調(diào)用成功返回值>=0
av_read_frame()
函數(shù)原型:
函數(shù)功能:
用于獲取一幀完整的圖像數(shù)據(jù),或者獲得多幀完整的音頻數(shù)據(jù)。
參數(shù)說明:
AVFormatContext *s
:獲取到的形狀格式上下文AVFormatContext。AVPacket *pkt
:這個值不能為NULL,必須是一個開辟好的空間,用于接收AVPacket數(shù)據(jù)
返回值:
調(diào)用成功返回值>=0
av_seek_frame()
函數(shù)原型:
函數(shù)功能:
用于尋找某個特定幀。
參數(shù)說明:
AVFormatContext *s
:獲取到的形狀格式上下文AVFormatContext。int stream_index
:基本流索引,表示seek是針對哪一類流數(shù)據(jù)(音頻或視頻)。int64_t timestamp
:要seek的時間點,以time_base為單位。int flags
:標(biāo)志位,用于設(shè)置seek的方式。
返回值:
調(diào)用成功返回值>=0
基礎(chǔ)類型介紹
AVFormatContext
在使用FFMPEG進行開發(fā)的時候,AVFormatContext是一個貫穿始終的數(shù)據(jù)結(jié)構(gòu),很多函數(shù)都要用到它作為參數(shù)。它是FFMPEG解封裝(flv,mp4,rmvb,avi)功能的結(jié)構(gòu)體。
重要變量說明:AVIOContext *pb
:輸入數(shù)據(jù)的緩存unsigned int nb_stream
:音視頻流的個數(shù)AVStream **streams
:音視頻流char filename[1024]
:文件名int64_t duration
:時長(單位為微秒us)int bit_rate
:比特率(單位為bps)AVDictionary *metadata
:元數(shù)據(jù)
AVStream
AVStream是在FFmpeg使用過程中關(guān)于編解碼至關(guān)重要的結(jié)構(gòu)體之一,是對流(Stream)的封裝和抽象,描述了視頻、音頻等流的編碼格式等基本流信息。此外也是音頻、視頻、字母數(shù)據(jù)流的重要載體。
對于一個典型的mp4格式的媒體源來說,需要經(jīng)過解封裝(解復(fù)用),解碼然后輸出的過程。而解封裝從容器中分離出來的流,在FFmpeg中對應(yīng)的對象就是AVStream。解復(fù)用解出來幾條AVStream,就會在AVFormateContext中的nb_streams+1(總流數(shù)+1),并且將AVStream保存在streams數(shù)組中。
重要變量說明:
AVRational time_base
:表示時間基數(shù),AVRational是一個分?jǐn)?shù)類型結(jié)構(gòu)體,有兩個整形參數(shù)表示分子和分母,用于指示下一個參數(shù)int64_t類型中的duration表示多少分之一秒int64_t duration
:將duration單位轉(zhuǎn)換成秒:duration*(time_base.num/time_base.den)AVRational avg_frame_rate
:幀率AVCodecParameters *codecpar
:音視頻參數(shù),用于替代AVCodecContext
AVCodecParameters
enum AVMediaType code_type
:類型參數(shù),表示媒體流是音頻還是視頻enum AVCodecID codec_id
:表示編碼格式,h264,MPEG4, MJPEGuint32_t codec_tag
:一般不用int format
:表示視頻的像素格式(YUV420,YUV422...)或者音頻的采樣格式int width; int height
:視頻的寬、高(只有視頻有)uint64_t channel_layout
:一般取默認(rèn)值int channels
:聲道數(shù)int sample_rate
:采樣率int frame_size
:只針對音頻,一幀音頻的大小
AVPacket
AVBufferRef *buf
:用于存儲引用計數(shù)int64_t pts
:表示顯示時間,通過pts*(num/den)換算int64_t dts
:表示解碼時間uint8_t *data
int size
AVPacket *av_packet_alloc(void)
:創(chuàng)建AVPacket對象并初始化AVPacket *av_packet_clone(const AVPacket *src)
:通過復(fù)制創(chuàng)建對象,引用計數(shù)+1int av_packet_ref(AVPacket *dst,const AVPacket *src)
:作用于函數(shù)2類似av_packet_unref(AVPacket *pkt)
void av_packet_free(AVPacket **pkt)
:清空對象,引用計數(shù)-1void av_init_packet(AVPacket *pkt)
:手動初始化對象int av_packet_from_data(AVPacket *pkt,uint8_t *data, int size)
:創(chuàng)建AVPacket對象并初始化