Konfiguration eines AAC Decoders mit Media Codec (Audio kommt von Gstreamer)

  • Antworten:1
  • Geschlossen
Jonas Ney
  • Forum-Beiträge: 2

10.05.2016, 18:27:15 via Website

Hey!

Ich bin dabei eine App zu entwickeln, die einen AAC Audio Stream von Gstreamer empfängt, diesen decodiert und abspielt.
Meine Pipeline in Gstreamer sieht folgendermaßen aus:

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

Diese codiert den Audio Stream in AAC LC als mp4 mit einer Bitrate von 64000, einer SampleRate von 44100 und einem Channel in einen mpeg ts container.

Meinen Decoder initialisiere ich mit folgendem Code:

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);

Habe es auch schon ohne die Zeile "MediaFormat.KEY_IS_ADTS" probiert, es kommt zum selben Fehler.

Das ist der Code meines Decoders:

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);
        }

Ich erhalte folgende Fehlermeldung:

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

Wenn ich den Audio Stream in eine Datei speichere ist er abspielbar! Das Problem sollte also nicht beim Empfangen sondern beim Decoder liegen.

Ich bin für jede Hilfe dankbar :)