Media Stream Download zum remote ausführen übergeben?
-
Rundfunk-Anbieter bieten den Videostream in jenen grundsätzlich Varianten an:
I) Direkten Link zur
*.mp4
Videodatei der jeweiligen Qualitätseinstellung (low, mid, high):- Diese kann man leicht direkt an HTTP Download Programm wie curl, wget oder aria2 übergeben
- Dies verwende ich in meinem Setup für Hand downloading over to NAS (completely external download)
II) Link zur Video-Streaming-Manifest-Datei für das jeweilige Streaming Protokoll, z.B. der ORF liefert
.m3u
für HLS aus.- Der lokale Download z.b. im Set “Mac speichern” (mit dem Hilfsprogramm
ffmpeg
) funktioniert dabei einwandfrei: Das Streaming-Manifest wird an ffmpeg übergeben, der handhabt das Video-Streaming-Protokoll und die Ausgabe des Audio-Video-Streams erfolgt nicht wie beim Playback auf den Bildschirm, sondern wird einfach in eine Datei weiter-ge-piped. - Die Übergabe an ein HTTP Download Programm funktioniert hier naturgemäß nicht: Ladet und speichert die m3u Datei freilich wie sie ist. Davon hat man jedoch nichts, denn man will ja die Video-Datei am NAS abspeichern.
III. Falls es noch weitere grundsätzliche Varianten gibt, bitte gern angeben und erklären. Danke!
Fragen zu II: Wie kann man den HLS/MPEG-DASH/etc Video-Stream zum Download an ein NAS übergeben?
- Pfad zur zugrundeliegenden vollständigen Videodatei bekommen? Liefert die API jener Rundfunkanstalten eventuell auch die URL der vollständigen Video-Datei aus?
- Dann könnte ich dies als reinen HTTP Download handhaben (siehe Punkt 1).
- Die A/V-Quellen liegen ausschließlich segmentiert vor und können somit ausschließlich via Streaming Protokoll bezogen werden.
- Dann geht es nur mit Streaming-Protokoll-fähigem Programm wie ffmpeg. Das kann ich ja auch am NAS laufen lassen. Nur eben nicht ganz so flexibel/leicht wie mit aria2.
- a) Möglichkeit Parallelladen + Warteschleife zu kombinieren: wie zB “Erlaube 3 Downloads parallel, alles andere kommt in die Schleife”. aria2 kann das. ffmpeg selbst kann das höwa nicht. Man könnte das nur drüber aufbauen. Einen Steuerungsprozess, der Subprozesse spawned (Max-Parallel-DL) und die andren in Warteschleife hält. Das selber basteln werde ich nicht. Gibt’s dazu general purpose unix Lösung?
- b) Streaming-Download fortführen wo zuletzt gestoppt (nach Stromausfall, Internetausfall, Softwarecrash, etc)? Geht das mit ffmpeg? Bei reinem HTTP Download Programmen geht das leicht, zB bei
curl
gibt es-continue-at
. Bei Media-Streaming-Protocol to file piping, ist das nicht mehr so trivial. Ein simpler Byte-Offet geht da nicht. Zudem wendet ffmpeg im “Mac Speichern” Set einen Audio-Bitstream-Filter an, d.h. Quelle und Ziel sind dann von Haus aus etwas anders. Evtl gibt es aber dennoch Fortsetzung-Mechanismen? z.B. Letzter Timecode/Frame-Nr in lokal gespeicherter Datei auslesen, sowie letzte Segment-Grenze identifizieren. Dann Rückschluss ziehen in welchem Segment der Stream-Download zuletzt war. Dann letzten Segment-Part in lokaler Datei löschen, Stream-Download fortsetzen. Aber das klingt alles schon sehr komplex.
Also bevor ich da tiefer hineingehe, wollt ich mal fragen was die Macher und die Experten zu dem Thema sagen. Danke für Hinweise!
-
Die A/V-Quellen liegen ausschließlich segmentiert vor und können somit ausschließlich via Streaming Protokoll bezogen werden.
Ich würde mir ein Set machen das die m3u8 URLs in eine Datei auf dem NAS schreibt und diese dann dort von ffmpeg abarbeiten lassen.
-
@porg sagte in Media Stream Download zum remote ausführen übergeben?:
II) Link zur Video-Streaming-Manifest-Datei für das jeweilige Streaming Protokoll,
[…] die Ausgabe des Audio-Video-Streams erfolgt nicht wie beim Playback auf den Bildschirm, sondern wird einfach in eine Datei weiter-ge-piped.Es wird nicht weitergepiped, es wird das Format geändert.
Man kann auch die einzelnen TS-Segmente mit wget o. ä. laden. Dann kann man auch nach einer Unterbrechung oder einem Fehler beim Laden eines Segments dort wieder anknüpfen. Nur am Ende benötigt man ffmpeg, um alle TS-Segmente zu einer mp4-Datei zu wandeln.
-
@vitusson und @Georg-J danke für Eure Ideen! Zusammen habt ihr eigentlich alle Teile aufgezeigt die es dazu braucht.
Lösungs-Bestandteile
Nochmals Eure Vorschläge als numerische Oberpunkte, und als a-b-c… Unterpunkte was dazu noch auszuarbeiten werden müsste (“”).
- m3u8 files in Watch Folder hochkopieren als rudimentäre persistente Daten-Grundlage für die Job-Verwaltung.
- a) Diese erst löschen/umbenennen wenn Job fehlerfrei fertig ist. zB könnten die Dateien Status-Suffix bekommen wie .init, .inprogress , .done. Und somit können die Jobs auf der macro-Ebene leicht gestoppt und fortgesetzt werden. Das ist der erste Teil der Verarbeitung der noch mal tool-unspezifich ist. Guter Ansatz!
- b) Aus erhaltener m3u die qualitäts-spezifische(n) weitere(n) m3u Dateien laden in der alle Segmente stehen.
- c) Konvertiere filmname.m3u zu filmname.txt (in Format wie wget, curl & co es bruachen) – Das sollte mit einem sed find/replace zu machen sein.
- Einzelnen TS-Segmente mit Downloader Utility laden.
- Files aus filmname.txt Liste laden, und das mit pausieren/fortsetzen gehört zur Standardausrüstung.
- Da muss man nichts neu machen, nur die Paramatersyntax ordentlich nutzen.
- Am Ende mit ffmpeg die Segmente in Container ausgeben.
- Da muss man ebenso nichts neu machen.
Explizite Nachfrage — bevor man sich die Arbeit antut…
- Einen grundsätzlich anderen Ansatz Nr. 3 gibt es nicht?
- Die APIs jener Rundkfunkanstalten bieten keine full-video-URL ?
-
@porg Beachte noch das:
- Merke die URL zur m3u-Datei. Falls darin relative Adressen stehen, dann sind diese relativ zur gemerkten URL.
- Bennene die lokalen ts-Segmente um. Es gibt Fälle, da sind die Dateinamen aller Segmente eines Films gleich. (Sie unterscheiden sich im Verzeichnisnamen.)
- Du brauchst am Ende eine Liste der lokalen Dateinamen, die du ffmpeg mitgibst:
ffmpeg.exe -v quiet -i chunks.m3u8 -c copy media.mp4
-
Irgendwer denkt hier zu kompliziert oder ich zu einfach.
Man macht sich ein Set in dem man für m3u8 Suffixes definiert
das /foo/bin/FFMget.sh aus geführt werden soll
also PROGRAMM: /foo/bin/FFMget.sh
SCHALTER: %f %T.mp4
%f, das ist die URL, die wird in die Datei .ffmgetfle angehängt
Die URL sind schon unterschiedlich, je nach Auflösung, da braucht es keine
“Aus erhaltener m3u die qualitäts-spezifische(n) weitere(n) m3u Dateien laden in der alle Segmente stehen.”https://srf-vod-amd.akamaized.net/world/hls/battlemansion/2024/02/battlemansion_20240214_133227_4203100_v_webcast_h264_,q40,q10,q20,q30,q50,q60,.mp4.csmil/index-f1-v1-a1.m3u8 https://srf-vod-amd.akamaized.net/world/hls/battlemansion/2024/02/battlemansion_20240214_133227_4203100_v_webcast_h264_,q40,q10,q20,q30,q50,q60,.mp4.csmil/index-f3-v1-a1.m3u8 https://srf-vod-amd.akamaized.net/world/hls/battlemansion/2024/02/battlemansion_20240214_133227_4203100_v_webcast_h264_,q40,q10,q20,q30,q50,q60,.mp4.csmil/index-f6-v1-a1.m3u8
FFMget.sh
#!/bin/bash URL=$1 FILENAME=$(basename "$2") echo -e "$URL -c copy -bsf:a aac_adtstoasc \"$FILENAME\" " >>/$PFADZUNAS/.ffmgetfile exit 0
Dann schreibt man sich ein Skript das auf der NAS läuft
#!/bin/bash while read line; do eval ffmpeg -i $line; done < .ffmgetfile && rm -f .ffmgetfile
Mal so schnell zusammengehackt und kurz getestet, ich mache so was ähnliches für normale mp4 Downloads weil ich das Java Programm schließen möchte und später via aria2c downloade wenn es mir passt
Nur mal so als Denkansatz, das kann man sich ja individuell noch selber zurechtbasteln.
- Die APIs jener Rundkfunkanstalten bieten keine full-video-URL ?
Nein, sonst würde MV die ja nutzen…