6

Ich arbeite derzeit mit Android Jelly Bean MediaCodec API, um einen einfachen Video-Player zu entwickeln.Android MediaCodec API Video spielt zu schnell

Ich extrahiere Tracks, Audio- und Video in separaten Threads. Das Problem ist, dass die Videospur immer zu schnell abgespielt wird.

Wo kann das Problem versteckt sein?
Sowohl Audio als auch Video werden fast auf die gleiche Weise behandelt, mit der Ausnahme, dass Audio über AudioTrack wiedergegeben und Video an die Oberfläche gerendert wird.

+0

Wohin sind Sie dabei gekommen? – BlueVoodoo

+0

Können Sie Ihren Code bitte posten? Es wäre hilfreich, Debugging – itsmeagain

+0

Ich habe das gleiche Problem, haben Sie es herausgefunden? – xiaowoo

Antwort

3

Wenn Sie Frames mit maximaler Geschwindigkeit rendern, werden auf den meisten Geräten 60 fps erreicht. Sie müssen es entsprechend den vom Encoder bereitgestellten Präsentationszeitmarken takten.

Wenn die Eingabe beispielsweise ein von Android unterstütztes Format ist (z. B. eine typische .mp4-Datei), können Sie die Klasse MediaExtractor verwenden, um jeden Frame zu extrahieren. Der Zeitstempel kann mit getSampleTime() abgerufen werden. Sie möchten das Rendering um den Unterschied zwischen Zeitstempeln in aufeinander folgenden Frames verzögern - gehen Sie nicht davon aus, dass der erste Frame einen Zeitstempel von Null haben wird.

Gehen Sie auch nicht davon aus, dass Videobilder mit einer konstanten Rate (z. B. 30 fps) angezeigt werden. Bei einigen Quellen werden die Bilder ungleichmäßig ankommen.

Siehe das Beispiel "Play video (TextureView)" in Grafika, insbesondere die SpeedControlCallback Klasse. Das Video gen-eight-rects.mp4 verwendet variable Rahmendauern, um es auszuprobieren. Wenn Sie das Kontrollkästchen "Bei 60 Bildern pro Sekunde abspielen" aktivieren, werden die Präsentationszeitstempel ignoriert.

Verwandte Themen