FFmpeg多媒體格式轉(zhuǎn)換(一)

講解FFmpeg多媒體格式轉(zhuǎn)換之前先講下我們?cè)诟袷睫D(zhuǎn)換過程中需要用到的API及FFmpeg相關(guān)的結(jié)構(gòu)體介紹豪治,通過這篇文章介紹在來學(xué)習(xí)多媒體格式轉(zhuǎn)換時(shí)腦海中就會(huì)對(duì)整個(gè)流程有一個(gè)清晰的思路。

API列表介紹
  • avformat_open_input() 打開輸入文件并創(chuàng)建封裝格式 AVFormatContext

  • avformat_alloc_output_context2()/avformat_free_context() 輸出多媒體文件上下文,對(duì)應(yīng)的是avformat_alloc_input_context2() 輸入多媒體上下文

  • avformat_new_stream()創(chuàng)建一個(gè)新的音視頻流

  • avcodec_parameters_copy()拷貝多媒體參數(shù)信息,多媒體數(shù)據(jù)中有很多參數(shù),比如視頻幀率,音頻采樣率等等勉失,因?yàn)槲覀冎皇寝D(zhuǎn)換格式,需要將原來的參數(shù)復(fù)制到新的多媒體數(shù)據(jù)中

多媒體文件寫入相關(guān)的API

  • avio_open() 打開封裝格式上下文中的AVIOContext *pb原探,打開之后才能給往 AVFormatContext中寫入數(shù)據(jù)

  • avformat_write_header()乱凿,F(xiàn)Fmpeg將它支持的所有多媒體格式頭封裝成流的api,只需要調(diào)用這個(gè)函數(shù)FFmpeg會(huì)通過格式判斷來寫入相應(yīng)頭多媒體頭信息

  • av_write_frame()/av_interleaved_write_frame() 寫入多媒體信息咽弦,兩個(gè)函數(shù)都可以寫入多媒體文件

  • av_write_trailer()寫入多媒體尾部信息徒蟆,與頭部信息對(duì)應(yīng)。

相關(guān)結(jié)構(gòu)體介紹:
  • struct AVFormatContext:封裝格式的上下文离唬,用于存儲(chǔ)所有都視頻信息后专,其內(nèi)部重要變量如下

struct AVInputFormat *iformat:輸入數(shù)據(jù)的封裝格式

AVIOContext *pb:輸入數(shù)據(jù)的緩存

unsigned int nb_streams:視音頻流的個(gè)數(shù)

AVStream **streams:視音頻流

char filename[1024]:文件名

int64_t duration:時(shí)長(單位:微秒us划鸽,轉(zhuǎn)換為秒需要除以1000000)

int bit_rate:比特率(單位bps输莺,轉(zhuǎn)換為kbps需要除以1000)

AVDictionary *metadata:元數(shù)據(jù)

  • struct AVStream是存儲(chǔ)每一個(gè)視頻/音頻流信息的結(jié)構(gòu)體,下面是結(jié)構(gòu)體中的重要變量如下:

int index:標(biāo)識(shí)該視頻/音頻流

AVCodecContext *codec:指向該視頻/音頻流的>

AVCodecContext(它們是一一對(duì)應(yīng)的關(guān)系)

AVRational time_base:時(shí)基裸诽。通過該值可以把PTS嫂用,DTS轉(zhuǎn)化為真正的時(shí)間。FFMPEG其他結(jié)構(gòu)體中也有這個(gè)字段丈冬,但是根據(jù)我的經(jīng)驗(yàn)嘱函,只有AVStream中的time_base是可用的。PTS*time_base=真正的時(shí)間

int64_t duration:該視頻/音頻流長度

AVDictionary *metadata:元數(shù)據(jù)信息

AVRational avg_frame_rate:幀率(注:對(duì)視頻來說埂蕊,這個(gè)挺重要的)

AVPacket attached_pic:附帶的圖片往弓。比如說一些MP3,AAC音頻文件附帶的專輯封面蓄氧。

  • struct AVIOContext是FFMPEG管理輸入輸出數(shù)據(jù)的結(jié)構(gòu)體函似。AVIOContext中有以下幾個(gè)變量比較重要:

unsigned char *buffer:緩存開始位置

int buffer_size:緩存大小(默認(rèn)32768)

unsigned char *buf_ptr:當(dāng)前指針讀取到的位置

unsigned char *buf_end:緩存結(jié)束的位置

void *opaque:URLContext結(jié)構(gòu)

  • struct AVPacket是存儲(chǔ)壓縮編碼數(shù)據(jù)相關(guān)信息的結(jié)構(gòu)體喉童,重要的變量有以下幾個(gè):

uint8_t *data:壓縮編碼的數(shù)據(jù)撇寞。

例如對(duì)于H.264來說。1個(gè)AVPacket的data通常對(duì)應(yīng)一個(gè)NAL。

注意:在這里只是對(duì)應(yīng)蔑担,而不是一模一樣牌废。他們之間有微小的差別:使用FFMPEG類庫分離出多媒體文件中的H.264碼流

因此在使用FFMPEG進(jìn)行視音頻處理的時(shí)候,常称∥眨可以將得到的AVPacket的data數(shù)據(jù)直接寫成文件鸟缕,從而得到視音頻的碼流文件。

int size:data的大小

int64_t pts:顯示時(shí)間戳

int64_t dts:解碼時(shí)間戳

int stream_index:標(biāo)識(shí)該AVPacket所屬的視頻/音頻流排抬。

最后附一張F(tuán)Fmpeg關(guān)鍵結(jié)構(gòu)體的關(guān)系圖:

FFmeag中最關(guān)鍵的結(jié)構(gòu)體之間的關(guān)系

參考資料:雷霄驊 FFmpeg結(jié)構(gòu)體介紹

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叁扫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子畜埋,更是在濱河造成了極大的恐慌莫绣,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悠鞍,死亡現(xiàn)場(chǎng)離奇詭異对室,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咖祭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門掩宜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人么翰,你說我怎么就攤上這事牺汤。” “怎么了浩嫌?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵檐迟,是天一觀的道長。 經(jīng)常有香客問我码耐,道長追迟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任骚腥,我火速辦了婚禮敦间,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘束铭。我一直安慰自己廓块,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布契沫。 她就那樣靜靜地躺著带猴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埠褪。 梳的紋絲不亂的頭發(fā)上浓利,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天挤庇,我揣著相機(jī)與錄音,去河邊找鬼贷掖。 笑死嫡秕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苹威。 我是一名探鬼主播昆咽,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼牙甫!你這毒婦竟也來了掷酗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤窟哺,失蹤者是張志新(化名)和其女友劉穎泻轰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體且轨,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浮声,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旋奢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泳挥。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖至朗,靈堂內(nèi)的尸體忽然破棺而出屉符,到底是詐尸還是另有隱情,我是刑警寧澤锹引,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布矗钟,位于F島的核電站,受9級(jí)特大地震影響粤蝎,放射性物質(zhì)發(fā)生泄漏真仲。R本人自食惡果不足惜袋马,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一初澎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虑凛,春花似錦碑宴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锣披,卻和暖如春贞间,著一層夾襖步出監(jiān)牢的瞬間贿条,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工增热, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留整以,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓峻仇,卻偏偏與公主長得像公黑,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摄咆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容