2023-06-25 06:31:15來源:博客園
一.打開和關(guān)閉輸入文件和輸出文件
想要解決上面提到的問題,我們需要對mp3文件的格式有個大致了解,為了方便講解,我這里畫了個示意圖:
ID3V2 | 包含了作者,作曲,專輯等信息,長度不固定,擴展了 ID3V1 的信息量。 |
Frame | 一系列的幀,個數(shù)由文件大小和幀長決定 |
ID3V1 | 包含了作者,作曲,專輯等信息,長度為 128BYTE |
由于av_parser_parse2()這個方法的輸入必須是只包含音頻編碼數(shù)據(jù)的“裸流”,所以,我們在讀取mp3文件的時候,必須跳過ID3V2標簽部分,從Frame開始。所以,我們就必須知道ID3V2標簽的總長度。下面,我畫了個ID3V2標簽頭的示意圖,方便講解。
(相關(guān)資料圖)
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.將當(dāng)前幀傳入解碼器,獲取輸出的音頻采樣數(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
關(guān)鍵詞:
責(zé)任編輯:
一 打開和關(guān)閉輸入文件和輸出文件想要解決上面提到的問題,我們需要對m
6月25日是第33個全國土地日,今年的主題是“節(jié)約集約用地嚴守耕地紅線
中國山東網(wǎng)-感知山東6月22日訊6月21日,2023年山東省中小學(xué)教師合唱展
【6月8日美股成交額前20:特斯拉連續(xù)第10個交易日上漲】周四美股成交額
15年過去,郎錚已長大成人,并順利參加了今年的高考。
甘肅2023二級建造師查分時間由二級建造師考試欄目提供,查找更多考試報
一 打開和關(guān)閉輸入文件和輸出文件想要解決上面提到的問題,我們需要對m
我休假結(jié)束那天,父親從砂鍋中,舀出半碗烏雞湯,滴上兩滴生抽遞給我。
據(jù)了解,此前深藍S7已經(jīng)公布了預(yù)售價,其預(yù)售價區(qū)間為16 99萬-23 99萬
一、交通事故工傷醫(yī)療費原件給誰醫(yī)療費、票據(jù)原件已經(jīng)交至公司,公司對
今日雷霆總經(jīng)理普雷斯蒂在采訪中談到了霍姆格倫。普雷斯蒂表示:“我們
隨著端午假期到來,旅游市場也被點燃,各地推出了豐富的文旅活動,在吸
6月24日凌晨三點,國泰航空CX880航班因訊號異常中止起飛,緊急逃生梯打
濟寧市氣象臺2023年6月24日9時00分將高溫紅色預(yù)警信號降級為高溫橙色預(yù)
根據(jù)規(guī)定,甘肅2023年二級建造師成績查詢時間為:考后2-3個月,考生登
浙江省水文管理中心2023年6月24日17時發(fā)布嘉興水文站洪水紅色預(yù)警:受
參與活動的嘉賓在奧林匹克日橫幅簽名。6月23日是第76個奧林匹克日,今
1、出自動畫《神奇的朋友_咖寶蛋神》故事簡介:?故事發(fā)生在未來世界里
吃什么?去哪兒玩?數(shù)說端午消費
蝴蝶結(jié)的系法:1、把絲帶的兩頭打一個結(jié)。2、用手按住中間位置,把右側(cè)
截至2023年5月31日,2022年報計算機設(shè)備共有84家A股上市公司披露數(shù)據(jù),
據(jù)燈塔專業(yè)版實時數(shù)據(jù),截至6月24日21時33分,2023年端午檔(6月22日-6
電子發(fā)燒友原創(chuàng)章鷹?6月8日,在比亞迪年度股東大會上,董事長王傳福表
鼓聲激蕩、樂聲悠揚。昨日上午,2023海峽兩岸鄭成功文化節(jié)開幕式暨頌典
0x01前言主要是對上一篇文章中`php_again`這道題的補充。 0x02下載php
1、委托電話5991458859917888咨詢電話59520033。本文到此分享完畢,希
6月25日是第33個全國土地日,今年的主題是“節(jié)約集約用地嚴守耕地紅線
石斛的功效有哪些1、穩(wěn)定糖。石斛之所以有穩(wěn)定糖和降低糖的作用,主要
近日,長沙尋子22年的雷武澤(雷公)收到了警方傳來的好消息,兒子雷岳
今天,馬刺為新秀舉行了發(fā)布會,2023年NBA選秀大會,馬刺狀元簽選中文
6月21日晚在端午節(jié)前一天寧夏銀川發(fā)生燃氣爆炸事故已造成31人死亡、7人
1、在游戲中點開界面設(shè)置,找到傷害數(shù)字顯示,并把它打開。2、或者直接
中國山東網(wǎng)-感知山東6月22日訊6月21日,2023年山東省中小學(xué)教師合唱展
據(jù)知情人士透露,高盛已開始在全球范圍內(nèi)裁減董事總經(jīng)理。在交易低迷之
品牌是高質(zhì)量發(fā)展的重要標志,也是商業(yè)競爭和文化傳播的重要方式。中國
事關(guān)你的房貸!疆內(nèi)商業(yè)銀行下調(diào)貸款利率,約定,同業(yè),lpr,商業(yè)銀行,房貸
1、vivo手機系統(tǒng)恢復(fù)出廠設(shè)置,就可以恢復(fù)出廠的系統(tǒng)了。2、 可以在
近日,海青鐵路新河園站擴能改造工程獲市發(fā)展改革委核準批復(fù),青島鐵路
日前,奔馳官方發(fā)布了一組全新奔馳E級旅行版的官圖。新車基于全新一代
昨天是端午節(jié),你吃粽子了嗎?端午除了吃粽子,余杭人還有吃“五黃”的
1、已發(fā)請查收=v=已發(fā)送請查收“漠然作品”發(fā)了。2、請查收櫻花草。本
關(guān)于去皮了的土豆放冰箱能存放多久的內(nèi)容,包含削皮的土豆放冰箱可以保
據(jù)了解,此前深藍S7已經(jīng)公布了預(yù)售價,其預(yù)售價區(qū)間為16 99萬-23 99萬
綜合《莫斯科時報》和法新社報道,克里姆林宮24日表示,俄羅斯總統(tǒng)普京
1、他的吧好像叫阿科吧我不知道是什么意思你懂這個嗎。本文到此分享完
上海端午消費總體平穩(wěn),餐飲住宿增長較為明顯,住宿,節(jié)日,餐飲,端午,上
【在這片遼闊的土地上?】光明日報記者陳晨記者從農(nóng)業(yè)農(nóng)村部了解到,截
司法部近日發(fā)布數(shù)據(jù),截至去年底,全國共建成村級公共法律服務(wù)實體平臺
據(jù)燈塔專業(yè)版實時數(shù)據(jù),截至6月24日21時33分,2023年端午檔(6月22日-6
比賽開始后,泰山隊在進攻和防守中都保持著不錯的強度,特別是防守中的
1、增值稅專票信息電話錯了,可以抵扣。2、只要發(fā)票代碼、開票日期、發(fā)
直播吧6月24日訊國際足聯(lián)昨日官方宣布,2025世俱杯將在美國舉行,該屆
截至2023年5月31日,2022年報房地產(chǎn)開發(fā)共有106家A股上市公司披露數(shù)據(jù)
您好,現(xiàn)在蔡蔡來為大家解答以上的問題。常見主板進入bios的方法,主板
記者從蘭州市西固區(qū)應(yīng)急管理局了解到,6月24日21時39分左右,蘭州石化
據(jù)俄新社,俄羅斯總統(tǒng)普京6月24日簽署一項法律,規(guī)定在戒嚴期間可以征
近日,由河南省文化和旅游廳、河南省總工會、中國共產(chǎn)主義青年團河南省
2023年6月23日13時51分,351國道龍游段窯三線燈控路口,車輛在等待綠燈
北京詳解高溫津貼如何發(fā)放【昨日近五成氣象站最高溫達40℃及以上
6月21日,南京市特需學(xué)生家長服務(wù)中心在南京市特殊教育指導(dǎo)中心揭牌啟
在美國聯(lián)邦貿(mào)易委員會FTC訴微軟庭審第二日,谷歌前Stadia產(chǎn)品負責(zé)人Dov
日前,榮威榮威中高級純電轎車D7官圖正式發(fā)布。作為榮威全新新能源產(chǎn)品
日前,奔馳官方發(fā)布了一組全新奔馳E級旅行版的官圖。新車基于全新一代
來為大家解答以上問題,拒絕訪問u盤怎么解除,拒絕訪問很多人還不知道
王一博簡介刪除和肖戰(zhàn)主演的陳情令后,組里撿到了內(nèi)娛頂流群的手機(撿
本報訊22日,在油坊鎮(zhèn)長旺村的“粽”享端午游園會上,包粽子、畫額禮、
據(jù)俄羅斯《報紙報》當(dāng)?shù)貢r間24日報道,俄羅斯執(zhí)法人員在據(jù)信是瓦格納雇
6月23日,山東多地氣溫超過40℃,驕陽似火。今天11時,山東省氣象臺繼
一、十月放假安排1 10月1日至7日,中秋節(jié)黃金周期間,全國放假7天。2 1
1、傳說家庭不錯吧,畢竟人家也紅了幾年。2、條件應(yīng)該還可以。3、這不
1、1.見人已殺其馬/方共食其肉。2、2.駿馬被人宰殺后,秦穆公不但不
長江日報訊(通訊員任洋)帶球、傳球、射門……每天下午4時30分,武漢
約克是世界四大水系統(tǒng)中央空調(diào)品牌之一。其中央空調(diào)性能優(yōu)越,美觀舒適
預(yù)計2020考研成績公布2020年考研成績即將公布,各位考生都在緊張地期待
【6月8日美股成交額前20:特斯拉連續(xù)第10個交易日上漲】周四美股成交額
6月25日至27日,世界互聯(lián)網(wǎng)大會數(shù)字文明尼山對話在中國山東濟寧曲阜召
1、2019年河南大學(xué)雙一流建設(shè)開啟后。2、已全部在一本招生。3、河南大
中國西藏網(wǎng)訊又到粽葉飄香時,又是端午佳節(jié)至。為弘揚中華民族優(yōu)秀傳統(tǒng)
1、在立體幾何中,截面是指用一個平面去截一個幾何體(包括圓柱,圓錐
1、蘋果8plus的上市日期是2017年9月13日。2、IPhone8Plus是蘋果IPhone
今年4月,大眾官宣下一代的T-Roc,也就是國內(nèi)版本的探歌將是大眾最后的
【來源:東鄉(xiāng)區(qū)氣象臺】東鄉(xiāng)區(qū)氣象臺2023年06月24日04時48分變更暴雨黃
1、孟子三樂∶一樂父母都健在,兄弟沒有病患;二樂仰頭對天不覺得內(nèi)疚
二手房交易的陷阱有哪些?1、代購內(nèi)部廉價房有的人利用部分購房者急于
用戶精度,關(guān)于用戶精度介紹這個很多人還不知道,我們一起來看看!1、用
在傳統(tǒng)的電子顯微鏡中,對磁性材料進行原子分辨率觀察特別困難,因為磁
超8萬人次打卡!端午“粽”夏夜市集活動點亮江城夜色長江日報大武漢客
兩臺吊車配合現(xiàn)場施工,一線工程建設(shè)者們堅守在施工崗位上,緊張地投入
1、周五21點~22點,周六周日14點~15點2、剛開始半個小時一直打小怪累計
1、shuāngyuè霜月tánglǐshāngyǐn唐李商隱chūwénzhēngyànyǐwú
用戶帳戶控制設(shè)置,關(guān)于用戶帳戶控制設(shè)置介紹這個很多人還不知道,我們
1、藍鯨是迄今為止最大的鯨類動物、最大的現(xiàn)存動物和最大的哺乳動物。2
把“空間站”建在地球上——走進我國航天領(lǐng)域首個大科學(xué)裝置
用戶帳戶限制,關(guān)于用戶帳戶限制介紹這個很多人還不知道,我們一起來看
外資企業(yè)看好中國持續(xù)增資擴產(chǎn)
海外網(wǎng)6月24日電據(jù)美國《國會山報》6月22日報道,美政府前首席醫(yī)療顧問
2023年6月8日中芯集成連續(xù)5日融資凈買入累計2078 27萬元
央視網(wǎng)消息:這里是浙江金華武義縣柳城畬族鎮(zhèn)的十里荷花省級濕地公園。
一棵紫藤的“63歲”與“1歲”(2023-06-25)稿件來源新華每日電訊要聞
1、玩電吉他不一定電子管音箱。2、現(xiàn)在玩電吉他的方式很多:便攜式臥室
近期,縣住建局對照《建湖縣文明城市創(chuàng)建“十大專項整治提升百日行動”
2023年黑龍江鶴崗高考成績查詢時間將于6月24日左右公布,5種方式可查詢
1、是的,因為其它的動物在冬天來臨之前都為自己做窩,而寒號鳥從不做
6月25日是第33個全國土地日,今年的主題是“節(jié)約集約用地嚴守耕地紅線