我有2个示例程序。一个人将WAV转换为MP3。另一个捕获我的扬声器并写一个WAV文件。我尝试结合2:输入扬声器,输出MP3。我的结果是一个正确长度的MP3文件(所以我传递了正确的整数)但只有噪音(所以我传递了错误的数据) 工作转换源Wav到Mp3:
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 :(得分:0)
你的问题在这里:
LONG lBytesToMP3=lame_encode_buffer_interleaved(gfp, reinterpret_cast<short int*>(pData), nNumFramesToRead, mp3_buffer, MP3_SIZE);
当设计为采用16位声音数据时,您将8位声音数据传递给lame_encode_buffer_interleaved
。您通过reinterpret_cast<short int*>(pData)
投射数据的事实应该明确说明。
您需要实际传入16位声音样本。
如果您可以从输入中捕获16位样本,那就最好了。如果不是,则从8位样本转换为16位样本很容易。你只需缩放值!确保正确处理签名。