FFMpeg und HLS müssen Videos vollständig geladen werden, bevor sie abgespielt werden können

Ich verwende ffmpeg, um eine segmentierte Liste von Dateien zu generieren, um sie an eine iOS-App zu streamen. Die Liste der Dateien wird gut erstellt, aber wenn es an der Zeit ist, sie abzuspielen, muss das Video vollständig heruntergeladen werden, bevor die Wiedergabe beginnt. Dieses Verhalten scheint bei iOS, Safari und VLC der Fall zu sein.

Weiß jemand, warum das passiert und wie ich die Leistung der Wiedergabe verbessern kann? Ich habe die vollständige Kontrolle darüber, wie die Dateien in iOS aufgezeichnet und verarbeitet werden. Hier ist ein Beispielstream:

http://www.bytesizecreations.com/storie-test/hls.m3u8

Hier sind meine ffmpeg-Befehle zum Generieren der Segmente aus der Datei:

ffmpeg -i joined.ts -flags -global_header -vcodec copy -acodec copy -map 0 -f segment -segment_time 2 -segment_list hls.m3u8 -segment_list_size 999999 -segment_format mpegts out%03d.ts
Here is the output of ffprobe on the file:

  libavutil      54.  7.100 / 54.  7.100
  libavcodec     56.  1.100 / 56.  1.100
  libavformat    56.  4.101 / 56.  4.101
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  1.100 /  5.  1.100
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
Input #0, mpegts, from 'joined.ts':
  Duration: 00:00:07.96, start: 1.441667, bitrate: 3899 kb/s
  Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1280x720, 24 fps, 24 tbr, 90k tbn, 180k tbc
    Stream #0:1[0x101](und): Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, f
Ich bin mit FFMPEG leider nicht besonders vertraut, aber im Allgemeinen muss eine Datei bestimmte Metadaten vorladen, um eine streambare Datei zu sein. Wenn diese Daten nicht vorab geladen werden, muss der Download abgeschlossen werden, bevor die Datei abgespielt werden kann. Es wird manchmal Dinge wie "Progressiver Download" genannt. Ich bin sicher, jemand anderes kann Ihnen eine genauere Antwort für FFMPEG geben, aber hoffentlich kann Ihnen diese Richtung in der Zwischenzeit helfen.

Antworten (2)

So stellt sich nach vielen Recherchen heraus, dass dies das gewünschte Verhalten für Apples AVPlayer-Komponente ist. Grundsätzlich ist mein Internet hier, wo ich wohne, so langsam, dass die Komponente wartet, bis das Video vollständig heruntergeladen ist, bevor es abgespielt wird. Der beste und empfohlene Weg, dies zu umgehen, besteht darin, alternative Streams für das Video zu generieren, bevor Sie versuchen, es abzuspielen. Hier ist die Dokumentation zum m3u8-Format und den HLS-Streaming-Richtlinien:

https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/streamingmediaguide/Introduction/Introduction.html

Ich habe das obige befolgt und zwei zusätzliche Streams aus dem Original generiert: einen 200kbps, einen 400kbps und die Wiedergabe beginnt jetzt fast sofort. Ihr Kilometerstand kann je nach Geschwindigkeit Ihrer Internetverbindung variieren.

Alternativ können Sie, wenn Sie nicht so etwas wie HLS verwenden müssen, einfache mp4-Dateien verwenden. Stellen Sie sicher, dass sie -faststartaktiviert sind, wenn Sie die Datei mit ffmpeg verarbeiten.

Update: Um dies für andere Entwickler zu vereinfachen, habe ich ein SDK veröffentlicht, das Ihre mov- oder mp4-Dateien in einen Cloud-Dienst hochladen und die Datei in einen HLS-kompatiblen Stream konvertieren kann. Das SDK kann über Cocoapods installiert werden und Sie können hier auf die Dokumentation und das Framework zugreifen:

https://github.com/Storie/StorieCloudSDK

Es ist -movflags +faststartfür mp4.

Die einfachste Lösung ist die Verwendung von -movflags +faststart in Ihrem Befehl während der Transcodierung der Videodatei. Alle Metadaten werden an den Anfang der abzuspielenden Datei verschoben. Hoffe das hilft.