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