LAME PCM 编码 MP3 现在问题就是直接 录制的 PCM数据 转成MP3 后播放 就会有噪音。是不是还要做一些处理阿?? 请求支援! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 两种PCM数据可能有不同,比如采样率(16k or 44.1k ...),采样宽度(16 or 8bits),是否立体声。这些设置正确没有? 这些是 正确的阿, 我录音用的是 采样率 8000 采样宽度 16bit MONO 单声道。不只是有点噪音, 是从头到尾都是噪音。 我录音时, 采样率 8000 宽度 16bit 单声道从头到尾都是噪音。 如果单单是参数配置问题的话,也不应该都是噪音阿。 AudioRecord录音得到的PCM数据,你验证了是播放正常的?参数配置错误的话,出现什么问题都有可能。 我录制的PCM数据, 通过audioTrack播放正常。 用lame编码全为0的PCM数据,如果还有噪音,那lame工作不正常;没有,则参数设置有问题。 的确,全为0的话, 没有任何声音。lame_set_num_channels(gf, 1);lame_set_in_samplerate(gf,8000);lame_set_brate(gf,128);//lame_set_mode(gf,1); 默认识MONO 的吧lame_set_quality(gf,2);//lame_set_bWriteVbrTag(gf,0);int ipr = lame_init_params(gf);我录音 是 8000 16bit 针对于录音的编码,难道还有什么需要设置的吗? 让我想不通的是。 我用一段视频中抽取的PCM数据编码就没有问题。声音也是对的。 lame是不支持8KHz采样率的,最低16KHz。因为mpeg2 audio是这样的,只有mpeg4 audio(aac)才支持16KHz以下(如8KHz)的采样率,但lame不支持mpeg4 aac。你可以看一下视频中抽取的PCM的采样率是多少 做过。除了采样率,两种PCM数据还有不一样的地方吗?如采样宽度,单双声道 都是一样地啊。 宽度都是 16bit, 都是单声道 MONO是不是我的LAME用法不对啊,还是说你们对Lame库进行了改造呀。。? “但是当我用AudioRecord录音得到的PCM数据”建议在得到PCM数据的时候,先把PCM数据存一份,再编码。存的PCM数据用cooledit软件听一听,看是不是噪音,如果是噪音就说明你的CODEC送出来的数据就有噪音。 我目前就是按你说的这么做的,先把录制的PCM数据存到文件中去,然后读取这个文件在编码成MP3。voidJava_org_freemp3droid_Converter_convertMP3Simple(JNIEnv* env,jobject thiz,jstring inFile ,jstring outFile, jstring progF, int sampleRate, int bitRate){ int read, write; const char* outfs; outfs = (*env)->GetStringUTFChars(env, outFile, NULL); const char* infs; infs = (*env)->GetStringUTFChars(env,inFile, NULL); FILE *pcm = fopen(infs, "rb"); FILE *mp3 = fopen(outfs, "wb"); const int PCM_SIZE = 8192; const int MP3_SIZE = 8192; short int pcm_buffer[PCM_SIZE*2]; unsigned char mp3_buffer[MP3_SIZE]; lame_t lame = lame_init(); lame_set_in_samplerate(lame, 44100); lame_set_brate(lame,192); lame_set_VBR(lame, vbr_default); lame_init_params(lame); do { read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); if (read == 0) write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); else write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE); fwrite(mp3_buffer, write, 1, mp3); } while (read != 0); lame_close(lame); fclose(mp3); fclose(pcm); return 0;}不考虑错误情况的话,这是最简单的LAME编码吧。请问是不是我用的方法不对,还是缺少一些处理? crystal28你当时怎么 AudioRecord 用的是 write(byte[],..,..) 还是 write(short[],..,..);lame_encode_buffer_int lame_encode_buffer_long2 lame_encode_buffer_longlame_encode_buffer_float lame_encode_buffer_interleaved lame_encode_buffer还有就是你用的哪个lame的解码方法阿? 麻烦告诉我一下阿。。 谢谢了。 我不是在android平台上做的。lame_encode_buffer常用的播放器啊,暴风影音,Windows Media Player write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);这个是处理双通道的,pcm_buffer把两个通道都和在一起了。你应该用 lame_encode_buffer其中可以把右通道的参数直接置NULL。lame.h有这个函数的具体写法。 如果读写缓冲区是字节数组(byte[]),对lame来说采样的字节顺序颠倒了,传给lame前需要交换每个采样的两个字节。 Android软件安装失败 在线等,纯新求助,$的意义。 monkeyrunner drag 问题 中文语音输入API Launcher更换背景图片 急求!!!bitmap拼接的问题 关于ndk opengl Android 中 智能提示很慢 android如何获取状态栏的高度? 删除 TextView使用includeFontPadding后出现的问题 android layout刷新控件位置问题
这些设置正确没有?
我录音用的是 采样率 8000 采样宽度 16bit MONO 单声道。不只是有点噪音, 是从头到尾都是噪音。
参数配置错误的话,出现什么问题都有可能。
没有,则参数设置有问题。
lame_set_in_samplerate(gf,8000);
lame_set_brate(gf,128);
//lame_set_mode(gf,1); 默认识MONO 的吧
lame_set_quality(gf,2);
//lame_set_bWriteVbrTag(gf,0);
int ipr = lame_init_params(gf);我录音 是 8000 16bit 针对于录音的编码,难道还有什么需要设置的吗? 让我想不通的是。 我用一段视频中抽取的PCM数据编码就没有问题。声音也是对的。
因为mpeg2 audio是这样的,只有mpeg4 audio(aac)才支持16KHz以下(如8KHz)的采样率,
但lame不支持mpeg4 aac。
你可以看一下视频中抽取的PCM的采样率是多少
除了采样率,两种PCM数据还有不一样的地方吗?如采样宽度,单双声道
Java_org_freemp3droid_Converter_convertMP3Simple(JNIEnv* env,jobject thiz,jstring inFile ,jstring outFile, jstring progF, int sampleRate, int bitRate){
int read, write; const char* outfs;
outfs = (*env)->GetStringUTFChars(env, outFile, NULL); const char* infs;
infs = (*env)->GetStringUTFChars(env,inFile, NULL); FILE *pcm = fopen(infs, "rb");
FILE *mp3 = fopen(outfs, "wb"); const int PCM_SIZE = 8192;
const int MP3_SIZE = 8192; short int pcm_buffer[PCM_SIZE*2];
unsigned char mp3_buffer[MP3_SIZE]; lame_t lame = lame_init();
lame_set_in_samplerate(lame, 44100);
lame_set_brate(lame,192);
lame_set_VBR(lame, vbr_default);
lame_init_params(lame);
do {
read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); if (read == 0)
write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
else
write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
fwrite(mp3_buffer, write, 1, mp3);
} while (read != 0); lame_close(lame);
fclose(mp3);
fclose(pcm); return 0;
}
不考虑错误情况的话,这是最简单的LAME编码吧。请问是不是我用的方法不对,还是缺少一些处理?
lame_encode_buffer_float lame_encode_buffer_interleaved lame_encode_buffer还有就是你用的哪个lame的解码方法阿? 麻烦告诉我一下阿。。 谢谢了。
lame_encode_buffer
常用的播放器啊,暴风影音,Windows Media Player
这个是处理双通道的,pcm_buffer把两个通道都和在一起了。你应该用 lame_encode_buffer
其中可以把右通道的参数直接置NULL。
lame.h有这个函数的具体写法。