2014-10-20 22 views
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++,現在看到微軟保護世界免受無能的程序員的影響。但是(我真的很抱歉)我不知道他們希望我做得對!

回答

0

你的問題是在這裏:

LONG lBytesToMP3=lame_encode_buffer_interleaved(gfp, reinterpret_cast<short int*>(pData), nNumFramesToRead, mp3_buffer, MP3_SIZE); 

你逝去的8位聲音數據lame_encode_buffer_interleaved當它被設計爲利用16位聲音數據。你通過reinterpret_cast<short int*>(pData)來鑄造你的數據的事實應該說清楚。

您需要實際傳遞16位聲音採樣。

如果您可以從輸入捕捉16位採樣,那最好。否則,從8位採樣轉換爲16位採樣很容易。你只是把價值放大!確保你正確處理簽名。

+0

如果我調試Wav編碼器,我看到他寫了一個BYTE數據流作爲PCHAR流到mmioWrite。如果我將WAV調試到MP3編碼器,我會發現WAV數據是16位(短整型)數字。我從AudioClient獲取它們作爲BYTE,並且需要將它們(按原樣)發送給Lame,但是這次是以short int數組的形式發送它們。所以樣本(因爲2個程序正常工作)實際上必須是16位。我可能搞砸了一個&或者*太多或太少 – Martin 2014-10-20 16:59:58

+1

經過多次嘗試,我終於找出發生了什麼。這是你的8位數,讓我看起來更接近:實際上它是32位浮點數,我以16 int的形式傳遞,你太靠近了,不能獲得分數! – Martin 2014-10-22 11:08:32

+0

太棒了。恭喜你搞清楚了! – StilesCrisis 2014-10-22 15:04:34