现在问题就是直接 录制的 PCM数据 转成MP3 后播放 就会有噪音。是不是还要做一些处理阿?? 请求支援! 

解决方案 »

  1.   

    两种PCM数据可能有不同,比如采样率(16k or 44.1k ...),采样宽度(16 or 8bits),是否立体声。
    这些设置正确没有?
      

  2.   

    这些是 正确的阿, 
    我录音用的是  采样率 8000  采样宽度 16bit  MONO 单声道。不只是有点噪音,  是从头到尾都是噪音。 
      

  3.   

    我录音时, 采样率 8000  宽度 16bit   单声道从头到尾都是噪音。 如果单单是参数配置问题的话,也不应该都是噪音阿。
      

  4.   

    AudioRecord录音得到的PCM数据,你验证了是播放正常的?
    参数配置错误的话,出现什么问题都有可能。
      

  5.   

    我录制的PCM数据, 通过audioTrack播放正常。
      

  6.   

    用lame编码全为0的PCM数据,如果还有噪音,那lame工作不正常;
    没有,则参数设置有问题。
      

  7.   

    的确,全为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数据编码就没有问题。声音也是对的。
      

  8.   

    lame是不支持8KHz采样率的,最低16KHz。
    因为mpeg2 audio是这样的,只有mpeg4 audio(aac)才支持16KHz以下(如8KHz)的采样率,
    但lame不支持mpeg4 aac。
    你可以看一下视频中抽取的PCM的采样率是多少
      

  9.   

    做过。
    除了采样率,两种PCM数据还有不一样的地方吗?如采样宽度,单双声道
      

  10.   

    都是一样地啊。   宽度都是 16bit, 都是单声道 MONO是不是我的LAME用法不对啊,还是说你们对Lame库进行了改造呀。。? 
      

  11.   

    “但是当我用AudioRecord录音得到的PCM数据”建议在得到PCM数据的时候,先把PCM数据存一份,再编码。存的PCM数据用cooledit软件听一听,看是不是噪音,如果是噪音就说明你的CODEC送出来的数据就有噪音。
      

  12.   

    我目前就是按你说的这么做的,先把录制的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编码吧。请问是不是我用的方法不对,还是缺少一些处理?
      

  13.   

    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的解码方法阿? 麻烦告诉我一下阿。。 谢谢了。
      

  14.   

    我不是在android平台上做的。
    lame_encode_buffer
    常用的播放器啊,暴风影音,Windows Media Player
      

  15.   

    write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
    这个是处理双通道的,pcm_buffer把两个通道都和在一起了。你应该用 lame_encode_buffer
    其中可以把右通道的参数直接置NULL。
    lame.h有这个函数的具体写法。
      

  16.   

    如果读写缓冲区是字节数组(byte[]),对lame来说采样的字节顺序颠倒了,传给lame前需要交换每个采样的两个字节。