MediaCodec AAC - > Android上的PCM解码器配置

时间:2014-02-18 01:17:43

标签: java android mediacodec

我正在尝试按AAC -> PCM Decoder实施MediaCodec

首先,我按照下面的PCM -> AAC Encoder成功实施了MediaCodec

private boolean setEncoder(int rate)
{
    encoder = MediaCodec.createEncoderByType("audio/mp4a-latm");
    MediaFormat format = new MediaFormat();
    format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
    format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
    format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);//AAC-HE 64kbps
    format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE);
    encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    return true;
}

INPUT:PCM比特率= 44100(Hz)x 16(比特)x 1(单数)= 705600比特/秒

输出:AAC-HE比特率= 64 x 1024(比特)= 65536比特/秒

因此,数据大小大致压缩x11 ,我通过观察日志确认了这一点

  • AudioRecoder:读取4096字节
  • AudioEncoder:369字节编码

数据大小近似压缩x11,到目前为止一直很好。

现在,我有一台UDP服务器接收编码数据,然后对其进行解码。

解码器配置文件设置如下:

private boolean setDecoder(int rate)
{
    decoder = MediaCodec.createDecoderByType("audio/mp4a-latm");
    MediaFormat format = new MediaFormat();
    format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
    format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
    format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);//AAC-HE 64kbps
    format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE);
    decoder.configure(format, null, null, 0);

    return true;
}

由于UDPserver数据包缓冲区大小为1024

  • UDPserver:收到1024字节

由于这是压缩的AAC数据,我希望解码大小为

大约1024 x11,但实际结果是

  • AudioDecoder:8192字节已解码

大约x8,我觉得有些不对劲。

任何人都可以考虑一下这个问题吗?谢谢。

PS。

解码器代码如下:

byte[] buffer2 = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer2, buffer2.length);
//..............
//receive UDP packet here..............
ds.receive(packet);
sockAddress = packet.getSocketAddress();
address = sockAddress.toString();

// now decoding
inputBuffers = decoder.getInputBuffers();
outputBuffers = decoder.getOutputBuffers();
inputBufferIndex = decoder.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0)
{
    inputBuffer = inputBuffers[inputBufferIndex];
    inputBuffer.clear();
    inputBuffer.put(buffer2);
    decoder.queueInputBuffer(inputBufferIndex, 0, buffer2.length, 0, 0);
}

bufferInfo = new MediaCodec.BufferInfo();
outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0);

while (outputBufferIndex >= 0)
{
    outputBuffer = outputBuffers[outputBufferIndex];
    outData = new byte[bufferInfo.size];
    outputBuffer.get(outData);

    Log.d("AudioDecoder", outData.length + " bytes decoded");

    decoder.releaseOutputBuffer(outputBufferIndex, false);
    outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0);
}

0 个答案:

没有答案