WAV压缩为MP3格式的时候有很大的噪音
乘帆关雪 2014-12-01 05:31:42 首先是要压缩的WAV文件的基本数据:位速:256kpbs,采样大小:8位,单声道,采样级别:32KHz,格式:PCM
我在网上根据一篇压缩的帖子上的代码进行了一些修改,现在能压缩成MP3,且文件时长一致,能听到文件内容但是有很大的噪音,因为对这个不太熟悉,担心自己在压缩的设置上有些问题,把代码贴出来请大家帮我指正一下,谢谢:
std::ifstream fin(Edit1->Text.c_str(), std::ios::binary);
if (!fin){
return;
}
fin.read((char*)&startID, sizeof(startID)); //从文件中读前面的12字节到流中
FormatChunk fc;
fin.read((char*)&fc, sizeof(FormatChunk)); //读取FormatChunk到流中
if (strncmp(fc.chunkID, "fmt ", 4) != 0){
Application->MessageBoxA("这不是一个有效的WAVE文件!", "Wav2MP3 ERROR", MB_OK);
return;
}
if (fc.wFormatTag != 1){
Application->MessageBoxA("不能转换一个已经压缩的文件!", "Wav2MP3 ERROR", MB_OK);
return;
}
BE_CONFIG bc;
bc.dwConfig = BE_CONFIG_MP3;
if (fc.dwSamplesPerSec==32000 || fc.dwSamplesPerSec==44100 || fc.dwSamplesPerSec==48000){
bc.format.mp3.dwSampleRate = fc.dwSamplesPerSec;
}else {
Application->MessageBoxA("不支持的采样率!", "Wav2MP3 ERROR", MB_OK);
return;
}
if (fc.wChannels == 1){
bc.format.mp3.byMode = BE_MP3_MODE_MONO;
}else {
bc.format.mp3.byMode = BE_MP3_MODE_STEREO;
}
//怀疑问题在这里
bc.format.mp3.wBitrate = 256;
bc.format.mp3.bCopyright = false;
bc.format.mp3.bCRC = false;
bc.format.mp3.bOriginal = false;
bc.format.mp3.bPrivate = false;
if (sizeof(FormatChunk) < int(8+fc.chunkSize)){
char c;
for (int i=0; i<int(8+fc.chunkSize-sizeof(FormatChunk)); i++){
fin.get(c);
}
}
Chunk chunk;
fin.read((char*)&chunk, sizeof(Chunk));
while (strncmp(chunk.chunkID, "data", 4) != 0){
char c;
for (int i=0; i<chunk.chunkSize; i++){
fin.get(c);
}
fin.read((char*)&chunk, sizeof(Chunk));
}
DWORD dwNumberOfSamples;
DWORD dwOutputBufferLength;
HBE_STREAM hStream;
if (beInitStream(&bc, &dwNumberOfSamples, &dwOutputBufferLength, &hStream) != BE_ERR_SUCCESSFUL){
Application->MessageBoxA("压缩失败!", "Wav2MP3 ERROR", MB_OK);
return;
}
std::ofstream fout(OutputFileName.c_str(), std::ios::binary);
char* MP3Buffer = new char[dwOutputBufferLength];
SHORT* InputBuffer = new SHORT[dwNumberOfSamples]; //SHORT就是shotr
int SamplesPerformed = 0;
DWORD dwNumberOfSamplesEncoded;
while (SamplesPerformed < chunk.chunkSize){
//问题可能在这里
fin.read((char*)InputBuffer, dwNumberOfSamples*2);
SamplesPerformed += dwNumberOfSamples;
if (beEncodeChunk(hStream, dwNumberOfSamples, InputBuffer, (BYTE*)MP3Buffer,
&dwNumberOfSamplesEncoded) != BE_ERR_SUCCESSFUL){
Application->MessageBoxA("压缩失败!", "Wav2MP3 ERROR", MB_OK);
delete MP3Buffer;
MP3Buffer = NULL;
delete InputBuffer;
InputBuffer = NULL;
return;
}
fout.write(MP3Buffer, dwNumberOfSamplesEncoded);
}
beDeinitStream(hStream, (BYTE*)MP3Buffer, &dwNumberOfSamplesEncoded);
beCloseStream(hStream);
delete MP3Buffer;
MP3Buffer = NULL;
delete InputBuffer;
InputBuffer = NULL;