FFMpeg erzeugte Videos mit m3u8-Segmenten lange vor dem Start der Wiedergabe

1651
Michael Gaylord

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

Weiß jemand, warum dies geschieht und wie ich die Wiedergabequalität verbessern kann? Ich habe die vollständige Kontrolle darüber, wie die Dateien in iOS aufgezeichnet werden und wie sie verarbeitet werden. Hier ist ein Beispielstrom:

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

Hier sind meine ffmpeg-Befehle, um die Segmente aus der Datei zu generieren:

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 

Hier ist die Ausgabe von ffprobe in der Datei:

 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, fltp, 222 kb/s 
1

1 Antwort auf die Frage

0
Michael Gaylord

Um Hochleistungs-Videostreaming zu ermöglichen, müssen mehrere Videoströme in verschiedenen Varianten vorhanden sein. Mit anderen Worten, Videos, die mit verschiedenen Bitraten und Auflösungen codiert sind, auf die alle von einer Wiedergabelistendatei (.m3u8) verwiesen wird.

Videoplayer, die Streams mit adaptiver Bitrate unterstützen, wählen dann einen Stream aus, der zu Ihrer Netzwerkverbindung passt, und können Streams nahtlos wechseln, wenn sich die Netzwerkbedingungen ändern. Der Grund für das Video, das ich streamen wollte, dauerte so lange, bis ich mit dem Abspielen beginnen konnte, weil ich nur einen Stream mit 720p-Auflösung hatte. Daher dauerte der Player sehr lange, um zu puffern, bevor er zu spielen begann.

Ich habe den von Apple erstellten Http Live Streaming (HLS) -Standard verwendet, um einen adaptiven Bitraten-Stream mit 5 Streams (den ich mit ffmpeg erstellt habe) zu generieren, und mein Video wird fast sofort abgespielt.

Shameless plug: Um das für Entwickler und andere Anwender einfacher zu gestalten, habe ich die Infrastruktur zusammengestellt, die wir zur Erzeugung von HLS-Streams zusammengestellt haben, mit einem iOS-SDK, das Sie hier herunterladen können: https://github.com/Storie/StorieCloudSDK