Die Fehlerbeschreibung lautet: AAC_DEC_DECODE_FRAME_ERROR < The parsed bitstream value is out of range. Most probably the bitstream is corrupt, or the system crashed.
Also muss irgendetwas an meinem Stream falsch sein, ich hab jedoch keine Ahnung wie ich herausfinden soll was.
Wie gesagt wenn ich den Stream abspeichere ist er abspielbar. Ich kann auch mit VLC Media Player direkt auf den Stream zugreifen und es funktioniert.
Beiträge von Jonas_N
-
-
Habe meinen Decoder jetzt ohne den Media Extractor konfiguriert. Die Fehlermeldungen mit MM_OSAL und der Konfigurationsdatei erhalte ich nicht mehr. Diese scheinen jedoch nicht das Hauptproblem gewesen zu sein, denn mein Programm funktioniert immer noch nicht und die Meldungen:
CodeW/SoftAAC2: aacDecoder_DecodeFrame decoderErr = 0x4004 W/SoftAAC2: AAC decoder returned error 0x4004, substituting silence I/SoftAAC2: Reconfiguring decoder: 0->44100 Hz, 0->0 channels
bleiben weiterhin bestehen.
-
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:
Java
Alles anzeigenformat.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:
Java
Alles anzeigenwhile (!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:
JavaW/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
-
Und was ist überhaupt dieses "MM_OSAL"? Ich kann im Internet nichts brauchbares dazu finden.
Die Datei auf die zugegriffen werden soll befindet sich im "data" Ordner von Android, eine App kann jedoch nicht ohne root Rechte auf diesen Ordner zugreifen. Warum will meine App auf diesen Ordner zugreifen?
Ich debugge mit Android Studio in dem ich mein Smartphone mit dem PC verbinde, hängt es vielleicht damit zusammen? -
Danke für die schnelle Antwort!
Habe in meiner Manifest die Permissions:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
gesetzt.
Die Fehlermeldungen bleiben weiterhin die selben. Auch wenn ich statt dem externen den internen Speicher benutze ändert sich nichts.
In der Fehlermeldung "E/MM_OSAL: MM_File_Create File Name /data/mmosal_logmask.cfg , Mode 0"
Wird die Datei "/data/mmosal_logmask.cfg" genannt, das ist jedoch nicht die Audio Datei, die ich abspeichere. Was könnte das für eine Datei sein? Möglicherweise wird sie vom Decoder erstellt? -
Hey!
Ich würde gerne Audio von meinem Raspberry mit Hilfe von Gstreamer an mein Android Handy senden.
In Gstreamer benutze ich folgende Pipeline:
gst-launch-1.0 audiotestsrc ! faac ! "audio/mpeg, mpegversion=4" ! mux. mpegtsmux name=mux ! udpsink host=224.0.0.1 port=8001
Dadurch erhalte ich AAC LC Audio Stream mit MPEG-TS als Container.
Ich versuche die Android App mit Android Studio selbst zu entwickeln. Die Daten empfange ich mit einem MulticastSocket. Nun muss der Audio Stream mit Media Extractor und Media Codec decodiert werden. Da Media Extractor nicht direkt auf den Socket zugreifen kann speichere ich ein Teil der Daten in eine Datei und setze diese als DataSource für den Media Extractor.
Der Media Extractor scheint teilweise zu funktionieren, er erkennt dass es sich um AAC Audio handelt. Allerdings erhalte ich viele Fehlermeldungen und es wird nichts abgespielt.
Der relevante Teil meines Codes sieht folgendermaßen aus:Code
Alles anzeigenMediaExtractor extractor = new MediaExtractor(); Uri path = Uri.fromFile(file); extractor.setDataSource(path.toString()); format = extractor.getTrackFormat(0); String mime = format.getString(MediaFormat.KEY_MIME); decoder = MediaCodec.createDecoderByType(mime); decoder.configure(format, null, null, 0); 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); }
Das hier sind die Fehlermeldungen in der Logcat:
Code
Alles anzeigenD/ExtendedUtils: Try creating ExtendedExtractor E/MM_OSAL: FileSource::FileSource E/MM_OSAL: FileSource::FileSource m_bEveryThingOK 1 E/MM_OSAL: MM_File_Create File Name /data/mmosal_logmask.cfg , Mode 0 E/MM_OSAL: MM_File_Create failed .Efs Error No -1 , File Name /data/mmosal_logmask.cfg , Mode 0 E/MM_OSAL: Open or read fail on /data/mmosal_logmask.cfg. Possible permission denied issue. Looking for /data/misc/media/mmosal_logmask.cfg E/MM_OSAL: MM_File_Create File Name /data/misc/media/mmosal_logmask.cfg , Mode 0 E/MM_OSAL: MM_File_Create failed .Efs Error No -1 , File Name /data/misc/media/mmosal_logmask.cfg , Mode 0 E/MMParserExtractor: FileSourceWrapper::New returned NULL D/ExtendedUtils: default extractor is NULL, return extended extractor E/MM_OSAL: FileSource::FileSource E/MM_OSAL: FileSource::FileSource m_bEveryThingOK 1 E/MM_OSAL: MM_File_Create File Name /data/mmosal_logmask.cfg , Mode 0 E/MM_OSAL: MM_File_Create failed .Efs Error No -1 , File Name /data/mmosal_logmask.cfg , Mode 0 E/MM_OSAL: Open or read fail on /data/mmosal_logmask.cfg. Possible permission denied issue. Looking for /data/misc/media/mmosal_logmask.cfg E/MM_OSAL: MM_File_Create File Name /data/misc/media/mmosal_logmask.cfg , Mode 0 E/MM_OSAL: MM_File_Create failed .Efs Error No -1 , File Name /data/misc/media/mmosal_logmask.cfg , Mode 0 E/MM_OSAL: parseTransportStreamPacket isPESPacket failed 18954 E/MM_OSAL: parseTransportStreamPacket isPESPacket failed 18783 E/MM_OSAL: parseTransportStreamPacket isPESPacket failed 18954 E/MM_OSAL: parseTransportStreamPacket isPESPacket failed 18783 I/OMXClient: Using client-side OMX mux. E/OMXMaster: A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one. D/MediaCodec: MediaCodec[kWhatConfigure]: video-output-protection: 00000000, audio-output-protection: 00000000 E/Format:: audio/mp4a-latm W/SoftAAC2: aacDecoder_DecodeFrame decoderErr = 0x4004 W/SoftAAC2: AAC decoder returned error 0x4004, substituting silence I/SoftAAC2: Reconfiguring decoder: 0->44100 Hz, 0->0 channels
Wie schon gesagt schreibe ich zuerst einen Teil des Streams in eine Datei, auf welche der Extractor zugreift. Diese Datei lässt sich abspielen, auch mit den Android Music Player!
Also denke ich dass der Fehler weniger beim Senden und Empfangen, als eher beim Decodieren liegt. Ich habe mir auch eine AAC Testdatei heruntergeladen, mit dieser kommt es zu den selben Fehlermeldungen.
Wie ihr wahrscheinlich am Code erkennen könnt bin ich noch nicht sehr Fortgeschritten was Programmieren angeht und somit um jede Hilfe dankbar!