日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

G723音频格式读入内存

發布時間:2023/12/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 G723音频格式读入内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

音頻是用ffmpeg轉的,然后用c++把文件從磁盤讀到內存
按幀存儲,每一幀有24字節(192比特)
文件頭和碼流部分是分開的
我并不確定每個文件頭都一樣

文件頭和幀定義

struct WaveFileHead {char riff_id[4]; //"RIFF"int size0; //波形塊的大小char wave_fmt[8]; //"wave" and "fmt "// 二合一int size1; //格式塊的大小short fmttag; //波形編碼格式short channel; //波形文件數據中的通道數int sampl; //波形文件的采樣率int bytepersecblockalign; //平均每秒波形音頻所需要的記錄的字節數short blockalign; //一個采樣所需要的字節數short bitpersamples; //聲音文件數據的每個采樣的位數char notKnow[24]; // 不知道是什么char list[4]; // LISTint nothinSize;char otherThing[26]; // 對應著上個參數的大小 放一些沒啥用的東西char data[4]; //"data"short int datasize; //數據塊大小 };struct Frame {bitset<192> content; };

文件頭最后本應該有一個數據塊大小,也就是data是4字節,datasize也是4字節,但是不知道為什么拆開讀數據會有錯誤,我想有可能是上面的26字節數據塊的對齊有問題,暫時未知,沒有去研究,因為我并不需要修改文件頭。
所以上面這個bug后來讓我花了半個下午的時間去check,本來我需要的長度是102,但是sizeof出來時104…所以直接限定長度即可。
Frame 是一幀的定義,下面會開一個數組用來存body。

讀入723文件

ifstream f;WaveFileHead wavehead;int FrameCnt = 0;Frame *a = new Frame[99999];int size_wav = 102;G723(string s) {f.open(s, ios::binary);f.read((char *)&wavehead, size_wav);while (f) {f.read((char *)&a[FrameCnt++], sizeof( Frame)); // 每次讀一幀}}// 讀入一個723文件 獲取頭信息和幀信息

兩段代碼合在一起,加上頭文件和命名空間即可。
需要注意bitset的用法,是從低位存儲到高位,
也就是說 x = 12 的二進制是 1100,那么
x[0] = 0,
x[1] = 0,
x[2] = 1,
x[3] = 1

這個也是個坑爹的地方,這就意味著和碼元表對應的數據不一樣。
不過物理存儲倒是沒什么問題,讀寫需要加一個映射關系。

723文件寫出

void WriteFile(string path) {ofstream out(path, ios::binary);out.write((char *)&wavehead, size_wav);// 寫出頭信息out.write((char *)a, sizeof( Frame) * FrameCnt);// 寫出幀信息}

直接把頭信息和幀信息一起寫出即可。

總結

以上是生活随笔為你收集整理的G723音频格式读入内存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。