Android - MP3 JLayer缺少数据

时间:2017-11-21 13:29:56

标签: android audio mp3 jlayer

我有一台服务器,通过libmp3lame将实时语音编码为单声道或立体声mp3,并通过WebSocket将其发送到chunk。

我试图制作一个接收这些mp3块的Android应用程序,并使用最适合Android的音频播放器播放它们。我选择了AudioTrack,因为它似乎很容易为玩家添加块以及#34; stream"导向。 (因为我正在做的是向轨道发送一些字节数组,而不是在Android手机中本地存储的完整歌曲。)

由于AudioTrack不支持压缩音频格式(例如MP3),我必须将这些块解码为PCM以便随后播放。我正在使用着名的JLayer进行实时解码。多亏了这一点,我可以将每个样本播放到我的AudioTrack中,并听取服务器发送的内容。

我的问题是收到的/播放器音频被严重散播。 (我可以理解说话者所说的完美,但质量很差,就好像说话者有一个"机器人的声音")。

这是我用来接收/解码/播放那些byte []的代码。

public void addSample(byte[] data) throws BitstreamException, DecoderException, IOException {
    // JLayer decoder
    Decoder decoder = new Decoder();
    // Input Stream with the byte[] voice data
    InputStream bis = new ByteArrayInputStream(data);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    Bitstream bits = new Bitstream(bis);
    // Decoding MP3 data into PCM in a PCM BUFFER
    SampleBuffer pcmBuffer = (SampleBuffer) decoder.decodeFrame(bits.readFrame(), bits);
    // Sending the PCMBuffer data into Audio Track to play it
    mTrack.write(pcmBuffer.getBuffer(), 0, pcmBuffer.getBufferLength());
    bits.closeFrame();
}

这是我的AudioTrack初始化

mTrack= new AudioTrack.Builder()
            .setAudioAttributes(new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                    .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();
    mTrack.play();

因此,要了解发生了什么,我试图延迟pcmBuffer中包含的每个数据。它似乎是那些数据的一个重要部分,其中0在缓冲区的最开始(我说,缓冲区的1/5是0,所有这些都位于开头)。然后我拿了一台示波器,试图得到我的Android手机正在接收的信号。结果如下:

Oscilloscope

正如您所看到的,每个框架都存在,但是有些框架是空白的,并且#34;或0个数据值。每帧开始时的那些0使信号散列并且听起来很烦人。

我不知道这是来自MP3信号本身,我播放它的方式,AudioTrack,JLayer,还是我解码它的方式。所以,如果有人有想法,那将是非常棒的。

编辑:

找到一些有趣的东西。通过解码每个帧头,我可以访问许多信息,例如每帧的以ms为单位的时间。我记录了它:

System.out.println(bits.readFrame().ms_per_frame());

我发现我的每个帧都是24ms。当我回顾示波器时,我可以看到每帧实际上需要24ms,但每帧的开始/结束都用0填充。首先,它是解码问题吗?如果不是,我怎样才能在每帧中都有一个清晰的信号而没有小的分手? 我已经打印了每个帧发送给我的所有数据,每帧都以零的零开始。如果每个帧都有某种音频无效,我怎么能有清晰的信号呢?

如果我打印的是我收到每帧(96位)的MP3数据,我的前四个字节(可能是标题?)总是具有相同的值: " -1,-5,20,-60" 然后我有一个总是等于0的第五位,有时第六位也等于0.我应该删除那些吗?

0 个答案:

没有答案
相关问题