0
我有2個示例程序。一個將WAV轉換爲MP3。另一個捕獲我的揚聲器並寫入一個WAV文件。我嘗試將2:輸入揚聲器,輸出MP3結合起來。我的結果是正確長度的MP3文件(所以我通過整數正確數量的),但僅噪聲(我就這樣度過了錯誤的數據) 工作轉換源WAV到MP3:在VS C++中從BYTE *到int *的類型轉換
short int pcm_buffer[PCM_SIZE*2];
unsigned char mp3_buffer[MP3_SIZE];
read = fread(pcm_buffer, 2 * sizeof(short int), PCM_SIZE, pcm);
write=lame_encode_buffer_interleaved(gfp, pcm_buffer, read, mp3_buffer, MP3_SIZE);
size_t lBytesWritten = fwrite(mp3_buffer, write, sizeof(char), mp3);
工作編碼WAV格式是:
BYTE *pData;
hr = pAudioCaptureClient->GetBuffer(&pData, &nNumFramesToRead, &dwFlags, NULL, NULL);
LONG lBytesToWrite = nNumFramesToRead * nBlockAlign;
mmioWrite(hFile, reinterpret_cast<PCHAR>(pData), lBytesToWrite);
我的版本是:
BYTE *pData;
unsigned char mp3_buffer[MP3_SIZE];
hr = pAudioCaptureClient->GetBuffer(&pData, &nNumFramesToRead, &dwFlags, NULL, NULL);
LONG lBytesToMP3=lame_encode_buffer_interleaved(gfp, reinterpret_cast<short int*>(pData), nNumFramesToRead, mp3_buffer, MP3_SIZE);
fwrite(mp3_buffer, lBytesToMP3, sizeof(char), mp3);
我看不出錯誤。在10年前我用Borland C++編碼C++,現在看到微軟保護世界免受無能的程序員的影響。但是(我真的很抱歉)我不知道他們希望我做得對!
如果我調試Wav編碼器,我看到他寫了一個BYTE數據流作爲PCHAR流到mmioWrite。如果我將WAV調試到MP3編碼器,我會發現WAV數據是16位(短整型)數字。我從AudioClient獲取它們作爲BYTE,並且需要將它們(按原樣)發送給Lame,但是這次是以short int數組的形式發送它們。所以樣本(因爲2個程序正常工作)實際上必須是16位。我可能搞砸了一個&或者*太多或太少 – Martin 2014-10-20 16:59:58
經過多次嘗試,我終於找出發生了什麼。這是你的8位數,讓我看起來更接近:實際上它是32位浮點數,我以16 int的形式傳遞,你太靠近了,不能獲得分數! – Martin 2014-10-22 11:08:32
太棒了。恭喜你搞清楚了! – StilesCrisis 2014-10-22 15:04:34