Android-音频轨道噪音

Android-音频轨道噪音,android,mp3,pcm,audiotrack,Android,Mp3,Pcm,Audiotrack,我通过Android应用程序上的WebSocketClient接收到一些字节[]。这些字节是MP3字节: 第三层帧单通道MPEG-1无校验和48 kHz,32 kbit/s 我试图做的是在收到一个音轨后,立即将每个字节[]写入一个音轨。问题是,这些字节[]是MP3,这是AudioTrack类不接受的压缩格式。我正试着把它们解码成PCM。 下面是我如何创建我的音频曲目: final AudioTrack player = new AudioTrack.Builder() .

我通过Android应用程序上的WebSocketClient接收到一些字节[]。这些字节是MP3字节: 第三层帧单通道MPEG-1无校验和48 kHz,32 kbit/s 我试图做的是在收到一个音轨后,立即将每个字节[]写入一个音轨。问题是,这些字节[]是MP3,这是AudioTrack类不接受的压缩格式。我正试着把它们解码成PCM。 下面是我如何创建我的音频曲目:

final AudioTrack player = new AudioTrack.Builder()
            .setAudioAttributes(new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build())
            .setAudioFormat(new AudioFormat.Builder()
                    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                    .setSampleRate(48000)
                    .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
                    .build())
            .setBufferSizeInBytes(AudioTrack.getMinBufferSize(48000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT))
            .build();
最后,这是服务器发送给我的信息。我不知道我应该如何构建我的音轨来匹配这种格式。采样率设置为48000 Hz,我尝试了通道输出立体声和单声道。我尝试了所有的编码参数,但我仍然有一个非常差的质量和高调的声音。不知道我做错了什么

流#0:0:音频:mp3(libmp3lame),48000 Hz,单声道,s16p,32 kb/s

编辑: 正如我在评论中所说,我在一篇关于JLayer解码的相关文章中找到了一些东西,下面是新代码:

public void addSample(byte[] data) throws BitstreamException, DecoderException {
    Decoder decoder = new Decoder();
    InputStream bis = new ByteArrayInputStream(data);
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    Bitstream bits = new Bitstream(bis);
    SampleBuffer pcmBuffer = (SampleBuffer) decoder.decodeFrame(bits.readFrame(), bits);

    for (int i = 0; i < pcmBuffer.getBufferLength(); i++) {
        if (pcmBuffer.getBuffer()[i] != 0) {
            outStream.write(pcmBuffer.getBuffer()[i] & 0xff);
            outStream.write((pcmBuffer.getBuffer()[i] >> 8) & 0xff);
        }
    }
    System.out.println("--------");
    for (int j = 0; j < outStream.toByteArray().length; j++) {
        System.out.println(outStream.toByteArray()[j]);
    }
    System.out.println("--------");
    mTrack.write(outStream.toByteArray(), 0, outStream.toByteArray().length);
    bits.closeFrame();
}

因此,正如我所怀疑的,数据实际上被写为(左,右,左,右)。。。我不知道如何从这些设备中获得真正的单声道MP3信号。

好的,如果输入已经是PCM,那么您的代码可以工作,因此您需要某种第三方代码

如果您不想乱用本机代码(C/C++)和JNI桥,我建议您使用

编辑:您的编辑看起来不错。您是否尝试过直接播放MP3样本(使用JLayer),而不是使用AudioTrack

代码示例:

Player player;
/* create your input stream, bis in your code */     
player = new Player(bis);
player.play();

好的,如果输入已经是PCM,你的代码就可以工作了,所以你需要一些第三方代码

如果您不想乱用本机代码(C/C++)和JNI桥,我建议您使用

编辑:您的编辑看起来不错。您是否尝试过直接播放MP3样本(使用JLayer),而不是使用AudioTrack

代码示例:

Player player;
/* create your input stream, bis in your code */     
player = new Player(bis);
player.play();

谢谢!我有点不知所措,因为我以为在这个示例中我是在使用JLayer将MP3解码成PCM。除非“buff=(SampleBuffer)decoder.decodeFrame(frameHeader,bits);”没有真正解码我的MP3。很高兴您注意到了它,请尝试一下,看看是否有帮助。如果您需要有关JLayer的更多帮助,请随时更新您的问题,并按照您的建议进行更新。似乎我没有正确使用JLayer首先,非常感谢您的帮助,我最终使用了另一个AudioTrack实例,我的已弃用。我最终接收并播放声音。问题是现在它已经完全散列了。每件事都是高调的,不是吗continuous@jineb92很高兴你成功了。不知道那个高音,Srry非常感谢!我有点不知所措,因为我以为在这个示例中我是在使用JLayer将MP3解码成PCM。除非“buff=(SampleBuffer)decoder.decodeFrame(frameHeader,bits);”没有真正解码我的MP3。很高兴您注意到了它,请尝试一下,看看是否有帮助。如果您需要有关JLayer的更多帮助,请随时更新您的问题,并按照您的建议进行更新。似乎我没有正确使用JLayer首先,非常感谢您的帮助,我最终使用了另一个AudioTrack实例,我的已弃用。我最终接收并播放声音。问题是现在它已经完全散列了。每件事都是高调的,不是吗continuous@jineb92很高兴你成功了。不知道那高音的声音,srry@rckrd我在研究中偶然发现了这篇文章,但它只说JLayer可能是一个解决方案。我现在的问题是,我不能做任何事情work@rckrd我在研究中偶然发现了这篇文章,但它只说JLayer可能是一个解决方案。我现在的问题是我不能让JLayer工作