2023-06-25 05:32:32來源:博客園
一.打開和關閉輸入文件和輸出文件
(資料圖片)
想要解決上面提到的問題,我們需要對mp3文件的格式有個大致了解,為了方便講解,我這里畫了個示意圖:
ID3V2 | 包含了作者,作曲,專輯等信息,長度不固定,擴展了 ID3V1 的信息量。 |
Frame | 一系列的幀,個數(shù)由文件大小和幀長決定 |
ID3V1 | 包含了作者,作曲,專輯等信息,長度為 128BYTE |
由于av_parser_parse2()這個方法的輸入必須是只包含音頻編碼數(shù)據(jù)的“裸流”,所以,我們在讀取mp3文件的時候,必須跳過ID3V2標簽部分,從Frame開始。所以,我們就必須知道ID3V2標簽的總長度。下面,我畫了個ID3V2標簽頭的示意圖,方便講解。
File ID(3) | Version(2) | Flags(1) | Size(4) |
ID3V2標簽頭固定為10byte,其中,Size部分的值是指除ID3V2標簽頭之外數(shù)據(jù)的總長度。需要注意的是,在實際計算長度的時候,這4個字節(jié)的最高位需要舍棄,也就是說,只用到了28bit,即:0xxxxxxx0xxxxxxx0xxxxxxx0xxxxxxx
#define AUDIO_INBUF_SIZE 20480#define AUDIO_REFILL_THRESH 4096static FILE* input_file= nullptr;static FILE* output_file= nullptr;static const AVCodec* codec= nullptr;static AVCodecContext* codec_ctx= nullptr;static AVPacket* pkt= nullptr;static AVFrame* frame= nullptr;static AVCodecParserContext* parser= nullptr;static enum AVCodecID audio_codec_id;void close_input_output_files(){ if(input_file!= nullptr){ fclose(input_file); input_file= nullptr; } if(output_file!= nullptr){ fclose(output_file); output_file= nullptr; }}int32_t open_input_output_files(const char* input_name,const char* output_name){ if(strlen(input_name)==0||strlen(output_name)==0){ cout<<"Error:empty input or output file name."<二.音頻解碼器的初始化以及銷毀
int32_t init_audio_decoder(const char* audio_codec){ if(strcasecmp(audio_codec,"MP3")==0){ audio_codec_id=AV_CODEC_ID_MP3; cout<<"Select codec id:MP3"<id); if(!parser){ cerr<<"Error:could not init parser."< 三.解碼循環(huán)體
解碼循環(huán)體至少需要實現(xiàn)以下三個功能:
1.從輸入源中循環(huán)獲取碼流包
2.將當前幀傳入解碼器,獲取輸出的音頻采樣數(shù)據(jù)
3.輸出解碼獲取的音頻采樣數(shù)據(jù)到輸出文件
從輸入源中讀取音頻數(shù)據(jù)到緩存:
int32_t read_data_to_buf(uint8_t* buf,int32_t size,int32_t& out_size){ int32_t read_size=fread(buf,1,size,input_file); if(read_size==0){ cerr<<"Error:read_data_to_buf failed."<解碼循環(huán)體:
int32_t end_of_input_file(){ return feof(input_file);}static int32_t decode_packet(bool flushing){ int32_t result=0; result= avcodec_send_packet(codec_ctx,flushing? nullptr:pkt); if(result<0){ cerr<<"Error:avcodec_send_packet failed,result:"<=0){ result= avcodec_receive_frame(codec_ctx,frame); if(result==AVERROR(EAGAIN)||result==AVERROR_EOF){ return 1; } else if(result<0){ cerr<<"Error:avcodec_receive_frame failed."< nb_samples:"<<frame->nb_samples<<",frame->channels:"<<frame->channels< 0){ result=av_parser_parse2(parser,codec_ctx,&pkt->data,&pkt->size,data,data_size,AV_NOPTS_VALUE,AV_NOPTS_VALUE,0); if(result<0){ cerr<<"Error:av_parser_parse2 failed."< size){ cout<<"Parsed packet size:"< size< 0) data_size += len; } } } decode_packet(true); return 0;} 輸出解碼的音頻采樣數(shù)據(jù):
int32_t write_samples_to_pcm(AVFrame* frame,AVCodecContext* codec_ctx){ int data_size= av_get_bytes_per_sample(codec_ctx->sample_fmt); if(data_size<0){ cerr<<"Error:failed to calculate data size."<channels;ch++){ fwrite(frame->data[ch]+i*data_size,1,data_size,output_file); } } return 0;} 最終,main函數(shù)的實現(xiàn)如下:
int main(){ const char* input_file_name="../input.mp3"; const char* output_file_name="../output.pcm"; const char* codec_name="MP3"; int32_t result= open_input_output_files(input_file_name,output_file_name); if(result<0){ return result; } result=init_audio_decoder(codec_name); if(result<0){ return result; } result=audio_decoding(); if(result<0){ return result; } destroy_audio_decoder(); close_input_output_files(); return 0;}解碼完成后,可以使用ffplay播放output.pcm文件:
ffplay -ar 44100 -ar 2 -f f32le -i output.pcm
關鍵詞:
責任編輯:
日本強推核污染水排海日本民眾:不應做危害子孫后代的事
國泰航空一架由香港飛往洛杉磯的CX880航班因信號異常而中止起飛。飛機
1、可以在交管12123自己預約科目四考試。2、祝你考試合格。相信通過交
去南京夜賞秦淮美景,到青島曬日光浴,在廣州看賽龍舟……這個端午假期
絕美晚霞映紅了江夏人的朋友圈---6月23日黃昏時分江夏出現(xiàn)了絕美晚霞天
尤其是當MEGA踏足50萬元以上的純電市場后,原本構(gòu)建的品牌與技術認知還
隨著端午假期到來,旅游市場也被點燃,各地推出了豐富的文旅活動,在吸
第一單元識字1春(春風)(春雨)(春天)(春日)風(風雨)(風云)
第一步:先將兩條帶子交叉第二步:上面的帶子繞過下面的帶子,再從兩條帶
怕被卡脖子,德國還在瘋狂建設沿海浮式碼頭和氣化站
讓世遺邂逅音樂,讓音樂擁抱琴島。昨日記者獲悉,第四屆鼓浪嶼音樂節(jié)將
直播吧6月24日訊此前的一筆三方交易中,凱爾特人送走了斯瑪特,綠軍“
毛孔粗大時很容易影響個人形象,因此在毛孔粗大的時候應該了解具體的原
據(jù)俄羅斯《報紙報》當?shù)貢r間24日報道,俄羅斯執(zhí)法人員在據(jù)信是瓦格納雇
中央氣象臺6月24日06時繼續(xù)發(fā)布高溫橙色預警:預計6月24日白天,華北、
用戶開發(fā)型創(chuàng)新,關于用戶開發(fā)型創(chuàng)新介紹這個很多人還不知道,我們一起
這個是什么材料?冬天我碰到它會感覺很熱,是用來墊東西的。一接觸就 1
毛呢大衣沾上油污怎么洗?油漬清洗方法:1、準備一盆40度左右的溫水,
北京中考首日高溫“烤驗”突出或現(xiàn)40℃三連擊警惕中暑
光伏、風電等新能源綠色清潔,取之不盡,用之不竭,但也存在著諸多應用
香港一客機中止起飛11人受傷8人穩(wěn)定3人已出院
去南京夜賞秦淮美景,到青島曬日光浴,在廣州看賽龍舟……這個端午假期
第一代蔚來ES8是在2017年發(fā)布的,它是蔚來的首款量產(chǎn)車,這臺車的出現(xiàn)
保護知識產(chǎn)權激發(fā)創(chuàng)新活力
批次分數(shù)線、高考分數(shù)、全省排位……廣大考生翹首以盼的2023年河南普通
今年的端午假期,龍舟賽紛紛開鑼,村BA、村超火熱開打,豐富多彩的文體
日本強推核污染水排海日本民眾:不應做危害子孫后代的事
日前,以“鄉(xiāng)”當潮為主題的四川省第三屆鄉(xiāng)村文化振興魅力競演大賽敘州
潮新聞客戶端記者何麗娜通訊員馬學琴低血壓是一種常見健康問題,但很多
將頭發(fā)扎成簡單的雙馬尾,將一邊的雙馬尾用小皮筋等分成三份,將第一段
據(jù)thegamer消息,就在微軟承認Xbox已經(jīng)正式輸?shù)袅酥鳈C戰(zhàn)爭后,繼續(xù)否定
優(yōu)化專利申請主體結(jié)構(gòu)有利于促進國家深化產(chǎn)學研協(xié)同,加速創(chuàng)新鏈、產(chǎn)業(yè)
端午假期,多家景區(qū)和公園內(nèi)綠樹成蔭、蓮葉田田,是市民游客納涼、賞景
泰安日報社·中華泰山網(wǎng)訊(記者陳陽)端午假期,連日的高溫天氣并未沖
讓我們約定“數(shù)字尼山時刻”、開啟“數(shù)字尼山之旅”、共赴“數(shù)字文明之
“深海一號”大氣田二期關鍵控制性工程鋪設完成海底長輸管道,今天(24
國泰航空一架由香港飛往洛杉磯的CX880航班因信號異常而中止起飛。飛機
1、可以在交管12123自己預約科目四考試。2、祝你考試合格。相信通過交
記者從北京海關獲悉,今年1—5月,北京海關查獲進境瀕危動植物及其制品共
直播吧6月24日訊?在NBA選秀大會結(jié)束之后,美媒ForTheWin采訪了火箭4號
1、《海底兩萬里》主要人物簡介:2、小說主人公尼摩船長至少懂一門語言
河北省氣象臺2023年6月24日5時繼續(xù)發(fā)布高溫紅色預警信號:預計今天白天
??手持四五十萬預算,想買一輛豪華SUV,多數(shù)人都繞不開奔馳GLC(圖片|
當?shù)貢r間23日,國際移民組織地中海協(xié)調(diào)辦公室發(fā)言人迪·賈科莫通過社交
6月22日下午,殘奧會冠軍賈紅光和紅光服務隊志愿者來到莘縣燕塔街道尚
萬億級板塊機會來了?重磅解讀
不同的傷殘鑒定類型是不一樣的。(1)司法鑒定應該到司法機關指定的鑒定
年內(nèi)漲幅近60%,北交所“白馬股”獲機構(gòu)組團調(diào)研
近日新一批的自主研發(fā)CPU正式交付,而且已經(jīng)在國外市場被大批量采購,
6月24日,省招生委員會召開全體會議,劃定了我省2023年普通高校招生各
6月22日端午節(jié),伊能靜久違分享了一雙兒女的同框照,她透露此刻兒子放
6月24日晚,“天王嫂”方媛久違在個人社交平臺分享了一段老公視角出游v
近日,《最終幻想16》在M站的用戶評分正式解禁,相較于整體積極的媒體
呼市收入排名全國46,如何提高?,呼市,價格因素,呼和浩特市
02:16上海鐵路虹橋站今天同樣迎來大客流,全天到達旅客超34萬人次。鐵
6月24日晚,甘肅省蘭州市西固區(qū)一家企業(yè)發(fā)生閃爆事故,從網(wǎng)友拍攝的圖
去南京夜賞秦淮美景,到青島曬日光浴,在廣州看賽龍舟……這個端午假期
【媒體:隨著“瓦格納”推進莫斯科公共建筑進行了人員疏散】英國《衛(wèi)報
一門三大將是什么生肖1、十二生肖大將指的是生肖虎,虎自古以來就給人
銀行行業(yè)周報:同業(yè)存單發(fā)行規(guī)模下行
日前,以“鄉(xiāng)”當潮為主題的四川省第三屆鄉(xiāng)村文化振興魅力競演大賽敘州
大象新聞記者李莉蕓視頻報道6月23日,廣東陽江。陽江某風景游覽區(qū),多
人民網(wǎng)迪慶6月23日電(曾智慧)6月22日,迪慶·香格里拉——2023年端午
authfwsnapin dll是電腦文件中的dll文件(動態(tài)鏈接庫文件)。如果計算機
新科CUBAL總決賽MVP陳國豪,結(jié)束大學比賽之后并沒有空閑下來,先是趕赴
1、18萬英語:Onehundredandeightythousand。本文就為大家分享到這里,
從當前馬琳的設想來看,奧運單打名額的兩個席位,孫穎莎獲得名額已經(jīng)是
一門三大將是什么生肖1、十二生肖大將指的是生肖虎,虎自古以來就給人
直播吧6月24日訊在為新秀舉行的媒體見面會上,勇士新任總經(jīng)理鄧利維展
火箭4號秀新阿門-湯普森接受采訪時,談到了他與弟弟奧薩爾-湯普森(活
家中養(yǎng)什么烏龜好?1、巴西龜巴西龜是最常見和容易購買的龜種,價格、外
成為網(wǎng)紅之后
綜合外媒報道,對于普里戈任來說,比“瓦格納集團創(chuàng)始人”更為人
楚天都市報極目新聞記者鄭力強通訊員鄂文旅6月22日是端午假期第一天,
半島全媒體記者孫兆慧通訊員胡玉萍趙冰潔6月22日上午,南墅鎮(zhèn)婦聯(lián)聯(lián)合
【南方16條河流發(fā)生超警洪水】水利部24日發(fā)布汛情通報,6月20日以來,
近日,湖南省婁底市新化縣洋溪鎮(zhèn)的端午節(jié)龍舟比賽中發(fā)生了驚險一幕。當
1、申請條件一:初級黃金投資分析師(以下條件之一)2、(1)從事本職業(yè)6年
MCG制作并發(fā)行的解謎RPG新游《地牢公主》日前登陸steam,玩家將動腦筋
關于去皮了的土豆放冰箱能存放多久的內(nèi)容,包含削皮的土豆放冰箱可以保
瓦格納官方telegram對普京的發(fā)言做出了回應!并爆粗口,機器翻譯版本比
據(jù)外媒報道,當?shù)貢r間24日,在社交平臺Telegram上,一個與俄羅斯瓦格納
1955年,豐田汽車打造出了第一代豐田皇冠轎車,那是一款象征著人們逐漸
據(jù)了解,此前深藍S7已經(jīng)公布了預售價,其預售價區(qū)間為16 99萬-23 99萬
克里姆林宮24日表示,俄羅斯總統(tǒng)普京正全天候收到有關私營軍事集團“瓦
央視網(wǎng)消息:賽龍舟作為我國端午節(jié)的傳統(tǒng)習俗之一,已經(jīng)被列入國家級非
海南日報記者6月23日從省商務廳獲悉,今年以來,海南加大力度“走出去
火箭4號秀新阿門-湯普森接受采訪時,談到了他與弟弟奧薩爾-湯普森(活
福建2023年高考成績預計今天下午公布。省教育考試院昨天發(fā)布2023年普通
6月22日端午節(jié),伊能靜久違分享了一雙兒女的同框照,她透露此刻兒子放
批次分數(shù)線、高考分數(shù)、全省排位……廣大考生翹首以盼的2023年河南普通
6月24日,據(jù)北京市文旅局官方微信,全市129個劇場舉辦線下營業(yè)性演出共
中新社香港6月24日電(記者曾平)國泰航空一班前往洛杉磯的客機中止起飛
與非遺手工藝繩結(jié)傳承人一起編織五彩繩,帶孩子參加集體包粽子,線上欣
秋葵是一道營養(yǎng)非常豐富的蔬菜,尤其是里面的籽和膠液更具有獨特的保健
1、辦公室的工作,都是繁雜的、瑣碎的。2、辦公室工作很忙,但是忙過之
這篇初學者指南解釋了在Ubuntu、LinuxMint和Windows中升級到最新LibreO
■“廈門之夜”廈門會展業(yè)上海推介會舉行。6月19日-21日,“2023國際會
6月23日,廣州圖書館迎來新館全面開放十周年。當天,廣州圖書館以“十
“夏日夜經(jīng)濟”火熱激發(fā)消費新活力---
市醫(yī)保局用新思想指引南京醫(yī)保新實踐聚焦“四個破除”解決民生痼疾□南
▲余奶奶百歲生日現(xiàn)場。圖片由京山街道提供。江西新聞客戶端訊(江西日
【甘肅蘭州石化公司一裝置發(fā)生閃爆暫未有人員傷亡報告】財聯(lián)社6月25日
一 打開和關閉輸入文件和輸出文件想要解決上面提到的問題,我們需要對m