Ich verwende die Android MediaCodec-API, um h264-Frames zu decodieren. Ich konnte die Frames in der Ansicht decodieren und rendern. Mein Problem ist, dass der Decoder viele Frames verpasst, besonders die ersten Frames. DecodeMediaCodec.dequeueOutputBuffer () gibt -1 zurück. aÜber 150 h264 Bilder, gerade entschlüsselt 43 Bilder. Ich kann nicht finden, wo das Problem ist. Hier sind meine Codes.
%Vor%Nach dem Start des Decoders starte ich den Decoder-Thread.
%Vor%Weiß jemand warum? Ich hoffe deine Hilfe.Mein Android-Gerät ist Nexus 7.
-1 von MediaCodec#dequeueOutputBuffer()
zurück zu bekommen ist normal. Es bedeutet nur, dass es noch keine Ausgabe bereit hat.
Es ist nicht der Fall, dass Sie MediaCodec
einem Puffer codierter Daten übergeben und sofort einen decodierten Puffer zurückbekommen. Sie übergeben es einem Datenpuffer, der an den mediaserver
-Prozess gesendet wird, der ihn in den Hardware-AVC-Decoder einspeist, der immer noch initialisiert werden kann oder vielleicht nur auf ein paar Frames sitzt. Wenn der Decodiervorgang abgeschlossen ist, werden die decodierten Daten durch mediaserver
an Ihren App-Prozess zurückgegeben.
Der Trick ist, dass der Aufruf queueInputBuffer()
sofort zurückkehrt. Im Normalbetrieb läuft die Eingangsseite des Decoders einige Frames vor der Ausgangsseite. Wenn Sie mit der Eingabe fertig sind, legen Sie das Flag für das Ende des Streams fest. Wenn Sie sehen, dass EOS auf die Ausgabe gesetzt ist, wissen Sie, dass Sie das Ende erreicht haben.
Sie finden verschiedene Arbeitsbeispiele auf bigflake und in Grafika . Die Beispiele DecodeEditEncodeTest und EncodeDecodeTest arbeiten ausschließlich mit Raw H.264, die anderen verwenden MediaExtractor
und MediaMuxer
, um MP4-Wrapper zu verarbeiten.
Tags und Links android decode mediacodec