如何配置媒体编解码器AAC解码器(与Gstreamer一起发送的音频)

时间:2016-05-10 13:16:05

标签: android gstreamer audio-streaming mediacodec aac

我想构建一个应用程序来播放由我的 Raspberry Pi 发送的带有 Gstreamer 的AAC音频流。这是我在Gstreamer中设置的管道:

gst-launch-1.0 audiotestsrc ! faac "bitrate=64000" ! "audio/mpeg, mpegversion=4, rate = 44100, channels = 1" ! mux. mpegtsmux name=mux! udpsink host=224.0.0.1 port=8001

它将AAC LC中的音频数据编码为mp4,比特率为64000,采样率为44100,mpeg ts容器中为1个通道。

我使用以下代码设置解码器:

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);
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
format.setInteger(MediaFormat.KEY_IS_ADTS, 1);

byte[] bytes = new byte[]{(byte) 0x11, (byte)0x90};
ByteBuffer bb = ByteBuffer.wrap(bytes);
format.setByteBuffer("csd-0", bb);

我也尝试过没有MediaFormat.KEY_IS_ADTS行。 (同样的错误)

这就是我的解码器的样子:

while (!stopTrack) {


    multicastSocket.receive(packet);

    decoder.start();
    data = packet.getData();

    inputBuffers = decoder.getInputBuffers();
    outputBuffers = decoder.getOutputBuffers();
    inputBufferIndex = decoder.dequeueInputBuffer(-1);

    if (inputBufferIndex >= 0)
    {
        inputBuffer = inputBuffers[inputBufferIndex];
        inputBuffer.clear();

        inputBuffer.put(data);

        decoder.queueInputBuffer(inputBufferIndex, 0, data.length, 0, 0);
    }

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

    while (outputBufferIndex >= 0)
    {
        outputBuffer = outputBuffers[outputBufferIndex];

        outputBuffer.position(bufferInfo.offset);
        outputBuffer.limit(bufferInfo.offset + bufferInfo.size);

        outData = new byte[bufferInfo.size];
        outputBuffer.get(outData);

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

        track.write(outData, 0, outData.length);

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

    }
}

我收到以下错误消息:

W/SoftAAC2: aacDecoder_DecodeFrame decoderErr = 0x4004
W/SoftAAC2: AAC decoder returned error 0x4004, substituting silence
I/SoftAAC2: Reconfiguring decoder: 0->48000 Hz, 0->0 channels
E/AndroidRuntime: FATAL EXCEPTION: Thread-374583

如果我将传入的数据保存到文件中,则可以播放!所以问题必须是解码器。

感谢您的帮助!

0 个答案:

没有答案