Wie kann man m3u8 Dateien in Powershell herunterladen


Leider ist m3u8 kein eindeutig definiertes Format. Aber es wird oft für Streaming von MP4 und ähnlichen verwendet.

Hier ein einfaches Beispiel wie man die Teile aus einer .m3u8-Datei mittels Powershell herunterladen kann:

$m3u8 = "http://irgendwoher.net/Video.m3u8"
$m3u8Local = ".\video.m3u8"
Invoke-WebRequest -UseBasicParsing –Uri $m3u8 –OutFile $m3u8Local

Die m3u8-Datei besteht dann aus irgendwelchen Textzeilen:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:6.006,
afis4sqr_00103518-16×9-720p-720p-3000k_00001.ts
#EXTINF:6.006,
afis4sqr_00103518-16×9-720p-720p-3000k_00002.ts
#EXTINF:6.006,
afis4sqr_00103518-16×9-720p-720p-3000k_00003.ts
#EXT-X-ENDLIST

Die TS-Dateien sind Sequenzen aus der MP4-Datei. Man erhält alle TS-Eintragungen z. B. so:

$ts = Get-Content $m3u8Local | where {$_ -notmatch "#.*"}

Damit werden alle Kommentarzeilen, die mit # beginnen entfernt.

Nun muss man aus $m3u8 Url den Stammpfad ermitteln.

$url = $m3u8.Substring(0,$m3u8.LastIndexOf(‚/‘))

Nun kann man mit dem Stammpfad von $m3u8 und den TS-Dateinamen die einzelnen Teile herunterladen:

$ts | % {Invoke-Webrequest -UseBasicParsing -Uri "$url/$_" -OutFile $_ -Verbose}

Um am Ende aus den einzelnen .TS-Dateien eine komplette .MP4-Datei zu bekommen kann man z. B. FFMPEG benutzen: https://www.ffmpeg.org/download.html. So bekommt man mit diesem Aufruf eine MP4-Datei:

.\ffmpeg.exe –i $m3u8Local -c copy -bsf:a aac_adtstoasc video.mp4

Man hätte aber auch hergehen können und gleich alles ffmpeg überlassen Zwinkerndes Smiley:

ffmpeg –i $m3u8 -c copy -bsf:a aac_adtstoasc .\video.mp4

Aber über den Umweg Powershell war es doch viel schöner. Vor allem hat die Powershell-Lösung auch den Vorteil, dass man die Headerzeilen und den Agenten verändern kann, falls nötig. Ach? Das geht mit ffmpeg auch? Na egal…

Advertisements

5 Antworten to “Wie kann man m3u8 Dateien in Powershell herunterladen”

  1. Quirel Says:

    Bullshit! M3U8 ist schon ziemlich definiert, vor allem von Apple!

    M3U8 ist eine UTF-8 kodierte Textdatei. Obiges Beispiel ist eine Video on Demand Playlist: https://developer.apple.com/documentation/http_live_streaming/example_playlists_for_http_live_streaming/video_on_demand_playlist_construction.

    Zu beachten gilt es auch die Spezifikation einer Masterdatei: https://developer.apple.com/documentation/http_live_streaming/example_playlists_for_http_live_streaming/creating_a_master_playlist.

    Kommt alles irgendwie von Apples HTTP Live Streaming: https://developer.apple.com/documentation/http_live_streaming.

  2. Quirel Says:

    Gibt sogar ein offizielles RFC 8216 dazu: https://tools.ietf.org/html/rfc8216

  3. Quirel Says:

    Bei ChromeDevTools kann man nach m3u oder m3u8 filtern. Man kann aber auch nach mime-type:application/vnd.apple.mpegurl oder mime-type:audio/mpegurl filtern, wenn der Dateiname nicht m3u oder m3u8 enthält.

  4. Quirel Says:

    Übrigens

    ffmpeg -i http://testvideo.com/master.m3u8

    gibt die verfügbaren Streams und Details auch Programme genannt aus, wenn es sich bei master.3u8 um eine Master-Datei handelt.

    Den dann gewünschten Stream bekommt man mittels

    ffmpeg -i http://testvideo.com/master.m3u8 -map 0:p: -codec copy video.mp4

    also

    ffmpeg -i http://testvideo.com/master.m3u8 -map 0:p:0 -codec copy video.mp4

    für das erste Programm (Program 0).

  5. Quirel Says:

    Dieser Player wird meistens benutzt um über Webseiten zu streamen: https://github.com/jwplayer/jwplayer

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s


%d Bloggern gefällt das: