社区
Android
帖子详情
LAME PCM 编码 MP3
sfate
2011-10-19 11:25:18
我用lame把重一段视频中抽取的PCM数据转换成MP3,并成功解码播放。(音质没有一点问题)。
但是当我用AudioRecord录音得到的PCM数据,将其编码成MP3后,在解码播放。(却都是噪音)。
如果有做过相关功能的或了解的,赐教阿。。。。。
...全文
914
25
打赏
收藏
LAME PCM 编码 MP3
我用lame把重一段视频中抽取的PCM数据转换成MP3,并成功解码播放。(音质没有一点问题)。 但是当我用AudioRecord录音得到的PCM数据,将其编码成MP3后,在解码播放。(却都是噪音)。 如果有做过相关功能的或了解的,赐教阿。。。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
cpp-
lame
编码
引擎将
PCM
转为
MP3
lame
编码
引擎,将
PCM
转为
MP3
FFMPEG实现
PCM
编码
AAC和
MP3
(采用封装格式实现)
基于FFMPEG实现把
PCM
编码
成AAC或者
MP3
格式的视频文件,
编码
的比特率都是64kbps,代码中AAC格式
编码
不需要音频重采样,而
MP3
格式
编码
只支持样本平行存储的方式。
Android使用
lame
编码
MP3
使用
lame
库将
pcm
编码
成
mp3
文件,使用Android Studio 新版,Cmake管理。
lame
for iPhone armV7
自己编译的用于ios下
编码
mp3
的
lame
库 使用方法 #include #include <
lame
/
lame
.h> int main(void) { int read, write; FILE *
pcm
= fopen("file.
pcm
", "rb"); FILE *
mp3
= fopen("file.
mp3
", "wb"); ...
node-
lame
:Node.js与lib
mp3
lame
和libmpg123的本机绑定
这是一个使用node-
lame
将来自process.stdin原始
PCM
数据
编码
为
MP3
文件的示例,该文件通过管道传输到process.stdout : var
lame
= require ( '
lame
' ) ; // create the Encoder instance var encoder = new
lame
. E
Android
80,351
社区成员
91,288
社区内容
发帖
与我相关
我的任务
Android
移动平台 Android
复制链接
扫一扫
分享
社区描述
移动平台 Android
android
android-studio
androidx
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章