Die Android-Videowiedergabe verzögert diese Dinge

1. Hintergrund

Im LAN-Modus spielt das Android-Mobiltelefon den Videostream der Kamera ab und verwendet den Android MediaCodec zum Decodieren, und die Videoverzögerung ist relativ groß, etwa 700 ms. Bei Verwendung von FFmpeg Soft Decoding + Transcoding beträgt die Verzögerung etwa 200 ms, aber das Bild friert ein und zittert stark.

Videobildinformationen
Bildrate: 30 fps
Bitrate: 1 Mbit/s
GOP: 10
Größe: 720P
Bildformat: IPPP (AUD SPS PPS)

2. Der Untersuchungsprozess

  • Hardware-Decodierung
    Da verschiedene Chips unterschiedliche Videocodes haben, sind auch die Beschleunigungsmethoden unterschiedlich.Nach Überprüfung der Hardwaredecodierung von Rockchip 3399 gibt es kein Problem wie Videoverzögerung.Huawei P30 hat dieses Problem nicht, und das Redmi-Mobiltelefon wird dieses Problem haben. Ich habe auch die Netzwerkinformationen überprüft, da AMediaCodec während des Dekodierungsprozesses einen bestimmten Datenrahmen zwischenspeichert, wodurch die Videowiedergabe später verzögert wird, indem "AMediaCodec_getInputBuffer" und "AMediaCodec_dequeueOutputBuffer" aufgerufen werden. Die Verzögerung ist sehr gering, innerhalb von etwa 1 bis 5 ms .

  • Software-Decodierung
    Da AMediaCodec nicht geändert werden kann, sollten Sie FFmpeg zum Decodieren verwenden, die Schnittstellen „avcodec_send_packet“ und „avcodec_receive_frame“ aufrufen und dann „sws_scale“ zum Transcodieren aufrufen. Es dauert etwa 400 ms, um eine GOP-Decodierung und -Transcodierung abzuschließen, die I-Frame-Decodierung dauert 80 ms und der durchschnittliche P-Frame beträgt etwa 35 ms.

  • Netzwerk-Jitter
    Netzwerk-Jitter ist einer der Störindikatoren für die Audio- und Video-Optimierung.Hier haben wir keine speziellen Daten gemacht, sondern nur einen Pcing-Smooth-Sende-Mechanismusauf der Sendeseite hinzugefügt.Das Testergebnis ist immer noch dasselbe, Delay-Jitter.

3. Lösungen

In Kombination mit den oben genannten Untersuchungspunkten dauert es bei der Soft-Decodierung „ungefähr 400 ms, um eine GOP-Decodierung und -Transcodierung abzuschließen.“ Wie im Hintergrund erwähnt, ist unsere Videoquelle GOP 10 und die Framerate 30, also gibt es drei GOPs pro Sekunde, eine GOP beträgt 333 ms, aber das Decodieren und Transcodieren dauert 400 ms. Dies stellt ein Problem dar. Die Decodierungsimplementierung kann den Empfang nicht einholen, sodass die nachfolgenden empfangenen Frames zu spät zum Decodieren sind, und der Frame wird es sein aktiv gelöscht, und das Video wird nacheinander angezeigt.

Konzentrieren Sie sich auf die Überprüfung der beiden Schnittstellen für Decodierung und Transcodierung, entfernen Sie die Transcodierungsschnittstelle und greifen Sie auf die zeitaufwändigen Protokolle zurück.Das Ergebnis: Die Decodierungszeit von einem Frame I Frame dauert durchschnittlich etwa 30 bis 60 ms , was fast der Hälfte der Zeit entspricht Zeit im Vergleich zu 80 ms. Wegen der Dekodierungsschnittstelle müssen wir FFmpeg verwenden, aber für die Transkodierungsschnittstelle erinnerte ich mich, dass libyuv auch für die eingebettete Dekodierung in webrtc verwendet wird, und dann habe ich es online überprüft. Sicher genug, einige Internetnutzer hatten es auch dieses Problem: Verwenden Sie libyuv, um sws_scale zu ersetzen, und verwenden Sie dann stattdessen decisively libyuv.

Schließlich löste die Verwendung von FFmpeg + libyuv das Video-Freeze-Problem auf Android-Telefonen.
Diese Situation hängt immer noch mit der Hardware zusammen. Das Huawei P30 wird nicht das Problem der verzögerten Verzögerung haben, egal ob bei der Hard-Decodierung oder der FFmpeg-Decodierung und -Transcodierung. Die Software-Decodierung ist extrem abhängig von der CPU-Verarbeitung.

Supongo que te gusta

Origin blog.csdn.net/edw200/article/details/126757973
Recomendado
Clasificación