在VS C ++中键入从BYTE *到int *的转换

时间:2014-10-20 16:38:10

标签: visual-c++

我有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 ++编程,并且现在看到微软可以保护全世界免受不称职的程序员的攻击。但是(我很抱歉)我不知道他们是怎么想让我做对的!

1 个答案:

答案 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位样本很容易。你只需缩放值!确保正确处理签名。