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;
...全文
357 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
乘帆关雪 2014-12-13
  • 打赏
  • 举报
回复
哎,等了这么久都没有人回复我
乘帆关雪 2014-12-01
  • 打赏
  • 举报
回复
没有人知道吗?顶起来!

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧