2014-10-20 57 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