G723音频格式读入内存
生活随笔
收集整理的這篇文章主要介紹了
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音频格式读入内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: layuiAdmin后台框架以及动态权限
- 下一篇: c语言中通过输入身份证号获取出生日期