ffmpeg HLS-Wiedergabeliste beginnt nicht am Anfang

2682
Collin Allen

Ich versuche, eine 5-minütige Videodatei aufzunehmen und eine einzelne HTTP-Live-Stream-Wiedergabeliste und .ts-Datei zu erstellen. Das Dateiformat der Wiedergabeliste unterstützt Byte-Bereiche anstelle von separaten Dateien ab iOS 5, was ein gutes Ziel für meine Anwendungsfälle ist. Wenn ich meinen ffmpegBefehl .m3u8ausführt, beginnt der erste Eintrag in der resultierenden Wiedergabeliste nicht bei (oder sogar in der Nähe) Byte 0.

Zum Beispiel:

ffmpeg -i input -hls_flags single_file out.m3u8 

Produziert eine Playlist wie folgt:

#EXTM3U #EXT-X-VERSION:4 #EXT-X-TARGETDURATION:11 #EXT-X-MEDIA-SEQUENCE:63 #EXTINF:1.376367, #EXT-X-BYTERANGE:568324@63107840 out.ts #EXTINF:1.334667, #EXT-X-BYTERANGE:235564@63676164 out.ts #EXTINF:1.918589, #EXT-X-BYTERANGE:343288@63911728 out.ts #EXTINF:10.427078, #EXT-X-BYTERANGE:3311996@64255016 out.ts #EXTINF:5.672333, #EXT-X-BYTERANGE:52828@67567012 out.ts #EXT-X-ENDLIST 

Beachten Sie, dass der erste EXT-X-BYTERANGEEintrag nicht lautet. @0Die 68-MB- .tsDatei enthält etwa 63 MB . Beim Laden der Wiedergabeliste in ein <video>Tag und Öffnen des HTML-Codes mit Safari beginnt die Videowiedergabe etwa 20 Sekunden nach dem Ende des Eingabevideos, nicht bei 0, und es ist nicht möglich, zuvor zu scrubben.

Warum wurde ffmpegeine Wiedergabeliste erstellt, die nicht das gesamte Video enthält ? Wenn ich mir die .tsneben der Wiedergabeliste erstellte Datei anschaue, sind alle Videoinhalte vorhanden.

Ich sehe dies an aktuellen ffmpegstatischen Builds unter Linux sowie an einer von Homebrew erstellten Version von ffmpeg2.7.1 unter OS X.

5

1 Antwort auf die Frage

6
Collin Allen

Nachdem ich die HLS-Dokumentation erneut gelesen hatte, fiel mir schließlich diese Option auf:

hls_list_size size

Legen Sie die maximale Anzahl der Wiedergabelisten fest. Bei der Einstellung 0 enthält die Listendatei alle Segmente. Der Standardwert ist 5.

In meiner ersten Frage gibt es fünf EXT-X-BYTERANGEEinträge vom Ende des Videos, die dem angegebenen Standardwert entsprechen. Die Einstellung hls_list_sizeauf, 0wie angegeben, stellt tatsächlich sicher, dass das Video am Anfang beginnt und alle erwarteten Bytebereiche enthält.

Was für ein bizarrer Standard! Wenn Sie Bytebereiche verwenden, denken Sie, dass sie erkennen würden, dass Sie eine Wiedergabeliste für die gesamte Datei erstellen möchten (standardmäßig). John vor 7 Jahren 1
Im Nachhinein denke ich, dass der Standard von ffmpeg mit der (wahrscheinlich korrekten) Annahme gewählt wurde, dass der häufigste Anwendungsfall der Funktion darin besteht, Echtzeit-Streams zu kodieren, bei denen nur die letzten Segmente das sind, was der Besucher wünscht, wenn er anfängt zu spielen . Collin Allen vor 7 Jahren 0