2016-05-21 8 views
0

Ich versuche, einen hl-Stream aus einer .mp4-Datei zu erstellen. Bisher kann ich eine Manifest + .ts Datei erstellen, aber ich habe keine Playlist.m3u8 um zu entscheiden, welchen manfest ich den Usern anhand ihrer Bandbreite geben soll. Wie mache ich das?Wie erstelle ich Wiedergabelisten/unterschiedliche Bandbreite mit ffmpeg?

Hier ist meine aktuelle Befehl, der HLS-Streams (keine Wiedergabeliste) erstellt:

ffmpeg -i test.mp4 -codec copy -vbsf h264_mp4toannexb -map 0 -f segment -segment_list out.m3u8 -segment_time 10 out%03d.ts 

Was dies schafft, ist out.m3u8:

#EXTM3U 
#EXT-X-TARGETDURATION:10 
#EXT-X-MEDIA-SEQUENCE:0 
#EXTINF:10, 
out.ts 
#EXTINF:10, 
out.ts 

Was ich erstellen möchten:

#EXTM3U 
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=860000 
low.m3u8 
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000 
medium.m3u8 
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000 
high.m3u8 

Antwort

3

Um zuerst adaptive streaming with HLS zu tun, müssen Sie Ihr Video mit den Bitraten verschlüsseln, die Sie unterstützen möchten ort. Werfen Sie einen Blick auf Apples encoding recommendations für einige Beispiele.

Sobald Sie das getan haben, müssen Sie dann jedes Video segmentieren und eine Wiedergabeliste dafür erzeugen. Der letzte Schritt besteht darin, eine master playlist zu erstellen, in der Sie die URLs der Varianten-Playlists und Informationen zu jedem Stream wie Bandbreite, Auflösung usw. hinzufügen. Dies ist die Playlist, die Sie als Videoquelle für den Player verwenden.

Angenommen, Ihr Quellvideo wurde in 1080p aufgenommen und Sie möchten eine 360p-Variante mit einer Videobitrate von 1200k erstellen. Sie könnten mit dem folgenden ffmpeg Befehl so etwas:

ffmpeg -i 1080p.mov -c:v libx264 -vprofile baseline -vlevel 3.1 -s 640x360 -b:v 1200k -strict -2 -c:a aac -ar 44100 -ac 2 -b:a 96k 360p.mov 

Beachten Sie, dass die (Quelle) Video Sie die Varianten von Anforderungen erzeugen hohe Qualität sein - Sie kein 1080p-Video von einem 720p eines kodieren können (ohne Upscaling).

Als nächstes führen Sie den Befehl ähnlich dem in Ihrer Frage die Playlist und die Segmente für dieses Video zu erzeugen:

ffmpeg -i 360p.mov -codec copy -vbsf h264_mp4toannexb -map 0 -f segment -segment_time 10 -segment_format mpegts -segment_list 360p/playlist.m3u8 -segment_list_type m3u8 360p/fileSequence%d.ts 

Erstellen Sie nun einen Master-Playlist und die (relative) URL der Playlist hinzuzufügen, gerade erstellt. So etwas wie folgt aus:

#EXTM3U 
#EXT-X-STREAM-INF:BANDWIDTH=1228800,CODECS="mp4a.40.2,avc1.4d401e",RESOLUTION=640x360 
360p/playlist.m3u8 

(Das Attribut Bandbreite sollte auch berücksichtigen, die Bitrate des Audio, die ich hier nicht getan haben.)

Wiederholen Sie den Vorgang für die anderen Varianten.

Der Player verwendet die Informationen über die verfügbaren Streams in der Playlist und die verfügbare Bandbreite zu diesem Zeitpunkt, um zu bestimmen, welcher Stream am besten zum Abspielen geeignet ist.

+0

Gibt es eine Möglichkeit, die Master-Playlist progamatisch zu erstellen? Vielleicht mit ffmpeg? – Murilo

+0

Hallo @Murilo, ja. Siehe die Dokumentation: https://ffmpeg.org/ffmpeg-formats.html#hls –