LAME PCM 编码 MP3

sfate 2011-10-19 11:25:18
我用lame把重一段视频中抽取的PCM数据转换成MP3,并成功解码播放。(音质没有一点问题)。

但是当我用AudioRecord录音得到的PCM数据,将其编码成MP3后,在解码播放。(却都是噪音)。

如果有做过相关功能的或了解的,赐教阿。。。。。
...全文
914 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
s1981x 2014-07-11
  • 打赏
  • 举报
回复
如果读写缓冲区是字节数组(byte[]),对lame来说采样的字节顺序颠倒了,传给lame前需要交换每个采样的两个字节。
stweddy 2014-04-11
  • 打赏
  • 举报
回复
楼主问题解决了吗,我也遇到同样的问题,求解呀
szlwm 2013-01-06
  • 打赏
  • 举报
回复
楼主问题解决了吗,我也遇到同样的问题,求解呀
cxm19881208 2012-09-24
  • 打赏
  • 举报
回复
LZ问题解决没有。我也遇到同样问题了...
求解答
谢谢
jiokoi 2011-12-02
  • 打赏
  • 举报
回复
write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
这个是处理双通道的,pcm_buffer把两个通道都和在一起了。你应该用 lame_encode_buffer
其中可以把右通道的参数直接置NULL。
lame.h有这个函数的具体写法。
sfate 2011-10-20
  • 打赏
  • 举报
回复
的确,全为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数据编码就没有问题。声音也是对的。
sfate 2011-10-20
  • 打赏
  • 举报
回复
谢谢, 我去试试。。 
「已注销」 2011-10-20
  • 打赏
  • 举报
回复
用lame编码全为0的PCM数据,如果还有噪音,那lame工作不正常;
没有,则参数设置有问题。
sfate 2011-10-20
  • 打赏
  • 举报
回复
我录制的PCM数据, 通过audioTrack播放正常。
「已注销」 2011-10-20
  • 打赏
  • 举报
回复
AudioRecord录音得到的PCM数据,你验证了是播放正常的?
参数配置错误的话,出现什么问题都有可能。
sfate 2011-10-20
  • 打赏
  • 举报
回复
我录音时, 采样率 8000 宽度 16bit 单声道

从头到尾都是噪音。

如果单单是参数配置问题的话,也不应该都是噪音阿。
sfate 2011-10-20
  • 打赏
  • 举报
回复
这些是 正确的阿,
我录音用的是 采样率 8000 采样宽度 16bit MONO 单声道。

不只是有点噪音, 是从头到尾都是噪音。

「已注销」 2011-10-20
  • 打赏
  • 举报
回复
我不是在android平台上做的。
lame_encode_buffer
常用的播放器啊,暴风影音,Windows Media Player
sfate 2011-10-20
  • 打赏
  • 举报
回复
crystal28

你当时怎么 AudioRecord 用的是 write(byte[],..,..) 还是 write(short[],..,..);

lame_encode_buffer_int lame_encode_buffer_long2 lame_encode_buffer_long
lame_encode_buffer_float lame_encode_buffer_interleaved lame_encode_buffer

还有就是你用的哪个lame的解码方法阿? 

麻烦告诉我一下阿。。 谢谢了。

sfate 2011-10-20
  • 打赏
  • 举报
回复
我好像发现问题所在了。

之前我测试录音时, 写PCM 和读PCM都在一个程序里面。 测试声音没有问题。

但是当我 单独写一个程序读取 保存的PCM文件 并输出到AUDIOTRACK时确实噪音

很奇怪啊。。!!!! 
sfate 2011-10-20
  • 打赏
  • 举报
回复
我目前就是按你说的这么做的,先把录制的PCM数据存到文件中去,然后读取这个文件在编码成MP3。

void
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编码吧。

请问是不是我用的方法不对,还是缺少一些处理?


coding码场 2011-10-20
  • 打赏
  • 举报
回复
“但是当我用AudioRecord录音得到的PCM数据”建议在得到PCM数据的时候,先把PCM数据存一份,再编码。存的PCM数据用cooledit软件听一听,看是不是噪音,如果是噪音就说明你的CODEC送出来的数据就有噪音。
sfate 2011-10-20
  • 打赏
  • 举报
回复
都是一样地啊。   宽度都是 16bit, 都是单声道 MONO

是不是我的LAME用法不对啊,还是说你们对Lame库进行了改造呀。。? 
「已注销」 2011-10-20
  • 打赏
  • 举报
回复
做过。
除了采样率,两种PCM数据还有不一样的地方吗?如采样宽度,单双声道
sfate 2011-10-20
  • 打赏
  • 举报
回复
不行啊, 我换成了 44100 和 16000 都还是不好使。

你做过将录音的PCM转码成MP3的程序吗?
加载更多回复(5)

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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