Streaming-Inhalte herunterladen
Archivierte Anleitung
Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.
Achtung!
Die Verwendung dieses Howto geschieht auf eigene Gefahr. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich zusätzlich an den Verfasser des Howtos.
Hinweis:
Diese Howto-Anleitung wurde zuletzt von linux_joy am 31.05.2017 unter Ubuntu 14.04 erfolgreich getestet.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Hat man die Adresse herausgefunden – etwa durch den Artikel Archiv/Howto/Stream-Adressen ermitteln – dann sollte das Herunterladen funktionieren. Bei normalen HTTP-Adressen kann man eine Datei mit einem Download-Manager ebenso herunterladen wie mittels VLC. Man kann auch eine "Download-Erweiterung" für den Browser nutzen (z.B. Video DownloadHelper 🇬🇧 🇩🇪 für Firefox oder FVD 🇬🇧 für Opera).
Anders läuft es jedoch beim HTTP-Streaming.
Dateien mit einer Streaming-URL mit entweder dem Anfang mms://
oder rtsp://
lassen sich in vielen Fällen mit dem MPlayer herunterladen. Das gleiche gilt auch für URLs mit der Endung .asx.
Bei Dateien aus einer Streaming-URL mit dem Anfang rtmp://
kommen die beiden Programmen flvstreamer und rtmpdump in Betracht. Sie haben nahezu die identische Befehls-Syntax, ersteres ist aber weniger leistungsfähig. Diese können über die offiziellen Paketquellen installiert werden, was im nachfolgenden Abschnitt beschrieben wird.
Allgemein gilt: Falls der Stream nicht nur bloß heruntergeladen und in eine Datei kopiert, sondern auch noch zusätzlich transkodiert wird, so dauert der Vorgang mitunter um einiges länger.
Programme installieren¶
Für flvstreamer 🇬🇧 muss das folgende Paket installiert werden:[1]
flvstreamer (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install flvstreamer
Oder mit apturl installieren, Link: apt://flvstreamer
Für rtmpdump 🇬🇧 muss das folgende Paket installiert werden:[1]
rtmpdump (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install rtmpdump
Oder mit apturl installieren, Link: apt://rtmpdump
In diesem Paket befindet sich auch das Programm rtmpgw, welches ein HTTP-RTMP Stream Gateway ist. Näheres im Artikel Internet-TV/Stationen.
Für die Benutzung von rtmpdump siehe den Wikipedia-Artikel.
Alle Optionen findet man in den Manpages von flvstreamer bzw. rtmpdump.
Live-Streams sowie Video- oder Audio-Streams aufnehmen¶
HLS (HTTP Live Stream) aufnehmen¶
Ein HLS kann mit ffmpeg
(aus dem FFmpeg-Projekt) bzw. Archiv/avconv (aus dem Archiv/Libav-Projekt) aufgenommen werden. Dabei werden Video-, Audio- und Untertitelstreams in eine Containerdatei kopiert (also ohne sie zu re-encodieren). Der Befehl[3] dafür lautet allgemein:
ffmpeg -i http://Adresse.m3u8 -c copy /Pfad/zur/Zieldatei.mkv
Man kann die Aufnahme mit der Tastenkombination Strg + C stoppen. Bei On-Demand-Streams geschieht dies am Ende automatisch.
Alternativ kann man auch die URL in Anführungszeichen setzen, und/oder die CODEC-Angabe sowie ggf. auch das Ausgabeformat modifizieren:
ffmpeg -i "http://Adresse.m3u8" -codec: copy /Pfad/zur/Zieldatei.mp4
In beiden vorherigen Beispielen werden dabei Streams mit nicht-unterstützten Codecs von ffmpeg einfach kommentarlos links liegen gelassen. Außerdem wählt ffmpeg die seiner Ansicht nach besten Streams aus der m3u8-Wiedergabeliste aus (siehe dazu auch Stream selection 🇬🇧 in der FFmpeg-Dokumentation). Diese müssen aber nicht zwangsläufig auch die tatsächlich hochwertigsten sein!
Im folgenden Beispiel werden deshalb alle vorhandenen Streams mit von FFmpeg unterstützten Codecs im Programm mit der anzugebenen Programm-Nummer (welche man vllt. über den Abschnitt Informationen zu den ermittelten Stream-Adressen anzeigen bekommen hat) in die Zieldatei kopiert. Außerdem wird lediglich ein Teil des gesamten Streams kopiert, und die üblichen Informationen über FFmpeg selbst werden unterdrückt:
ffmpeg -hide_banner -re -ss 01:05:02 -t 230 -i http://Adresse.m3u8 -map p:5 -codec: copy /Pfad/zur/Zieldatei.mp4
Mit der Option
-hide_banner
wird verhindert, dass FFmpeg seine ansonsten obligatorischen Eigen-Informationen wie z.B. Versions-Nummern und Built-Optionen ausgibt.Die optionale Option
-re
bewirkt, dass die Streams mit ihrer tatsächlichen Frame-Rate (fps (frames per second)), also in Echtzeit anstatt sonst so schnell wie möglich, gestreamt werden. Dies kann notwendig werden, falls der Stream ohne diese Option nach kurzer Zeit hängen bleibt und die Aktion dann deshalb manuell mittels der Tastenkombination Strg + C abgebrochen werden muss!-ss 01:05:02 -t 230
: Zuerst die Startposition in Stunden, Minuten u. Sekunden; danach die Dauer in Sekunden. Letztere kannalternativ auch als-t 00:03:50
angegeben werden. Je nach Einsatzzweck kann man Startposition oder Dauer auch weglassen. Näheres über die Zeit-Syntax 🇬🇧 steht in der FFmpeg-Dokumentation.Hinweis:
Leider erscheint bei neueren ffmpeg-Versionen die Meldung:
Timestamps are unset in a packet for stream 1. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
Dies scheint jedoch nicht weiter von Bedeutung zu sein.
-map p:5
: Die Programm-Nummer hat man vllt. durch ffprobe / avprobe über die Ausgabe von "Metadata: variant_bitrate" herausbekommen. Erstere kann auch mehrstellig sein. Bei letzterer Angabe gilt: Je höher, desto besser!-codec: copy
gibt an, dass alle angegebenen Streams lediglich kopiert werden und nicht re-encodiert.
Das folgende Beispiel ist aus verschiedenen Gründen exakt so angelegt:
ffmpeg -headers $'User-Agent: "FMLE/3.0 (compatible; FMSc/1.0)"\r\n' -i http://Adresse.m3u8 -map 0:p:4 -map -0:14 -codec: copy -b:v 50k -b:a 50k -bsf:a aac_adtstoasc /Pfad/zur/Zieldatei.mp4
Mit der Option
-headers
wird in diesem Fall der sogenannte "User Agent" geändert (Siehe auch den Abschnitt Programmkennung ändern).-map 0:p:4 -map -0:14
bedeutet, dass alle Spuren des Programmes Nr. 4 der ersten Eingangsdatei außer der darin enthaltenen Datenspur mit dem Stream-Index 14 verwendet werden sollen. Letzterer wird ausgespart, weil ffprobe zuvor die MeldungUnsupported codec with id 1414087731 for input stream 14
ausgegeben hat. Allerdings werden dabei normalerweise Streams mit nicht-unterstützten Codecs von ffmpeg sowieso automatisch ausgespart!-b:v 50k -b:a 50k
bedeutet, dass die Bitrate für sämtliche Video- und Audiokanäle der Zieldatei auf 50k gesetzt wird. In diesem Fall bedeutet das jedoch keine Einschränkung: Im Gegenteil, die Bitrate ging auf 1951.3 kbits/s hoch (Angabe in der Statuszeile). In vorhergehenden Versuchen ohne diese Optionen lag sie nur bei knapp der Hälfte, und der Stream hang nach kurzer Zeit, so dass die Aktion dann manuell mittels der Tastenkombination Strg + C abgebrochen werden musste. Offenbar kann der ausliefernde Streaming-Server ohne diese Optionen die Bitrate nicht vernünftig regeln! Wichtig ist in diesem Zusammenhang auch die fps-Angabe (frames per second): Je höher, desto besser! Allerdings muss das Setzen dieser Optionen auf solch niedrige Werte die Bitrate bzw. die fps-Rate auch nicht zwangsläufig in die Höhe treiben, das liegt immer am jeweiligen Server!-bsf:a aac_adtstoasc
setzt für alle Audiokanäle den Bitstrom-Filteraac_adtstoasc
. In vorhergehenden Versuchen ohne diese Option hatte es nämlich die FehlermeldungMalformed AAC bitstream detected: use the audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg) – av_interleaved_write_frame(): Operation not permitted
gegeben.
HDS (HTTP Dynamic Stream) aufnehmen¶
Mithilfe des in PHP geschriebenen Skriptes AdobeHDS.php 🇬🇧 von K-S-V's GitHub-Seite 🇬🇧 können Multimedia-Streams im Format HDS (Adobe HTTP Dynamic Streaming) entweder aufgenommen oder – via Pipe-Operator – an einen Mediaplayer weitergeleitet werden.
Dabei werden zunächst die einzelnen Fragment-Dateien heruntergeladen, in eine flv-Containerdatei kopiert (also ohne sie zu re-encodieren) und dabei nahtlos zusammengefügt. Anschließend werden die heruntergeladenen Fragmente gelöscht.
Von dem Skript werden sowohl On-Demand-Streams als auch Live-Streams verarbeitet.
Die Benutzung des Skriptes erfolgt über die Kommandozeile.
RTMP-Streams aufnehmen¶
Zum Speichern von rtmp://
-Streams siehe auch z.B. den externen Abschnitt Streaming-Videos des BR.
MMS-Streams aufnehmen¶
mms://
-Streams lassen sich sehr einfach mit MPlayer über ein Terminal[3] aufnehmen.
bei direkten
mms://
-Dateien:
mplayer -dumpstream mms://example.com/Globalplayers/GP_14.wmv -dumpfile ./download/test.wmv
Die Adresse des Streams mms://example.com/Globalplayers/GP_14.wmv
ist frei erfunden und nur ein Beispiel. Diese .wmv-Datei würde nun als test.wmv im Verzeichnis /download innerhalb des Home-Verzeichnisses des aktuell angemeldeten Benutzers gespeichert.
Bei indirekten
mms://
-Dateien (URLs mit der Endung .asx) lautet dagegen die Befehlszeile:
mplayer -playlist Streaming-Adresse.asx -dumpstream -dumpfile Dateipfad.wmv
Man kann die Aufnahme mit der Tastenkombination Strg + C stoppen. Bei On-Demand-Streams geschieht dies am Ende automatisch.
Manchmal erhält man während der Speicherung die Meldung:
Stream not seekable!
Dies bedeutet jedoch nicht, dass das Herunterladen nicht funktioniert. Je nach Größe der Datei dauert es eine Weile bis sich wieder etwas tut. Ist das gesamte Video gespeichert, dann erhält man die Meldung:
Everything done. Thank you for downloading a media file containing proprietary and patented technology. Core dumped ;) Exiting... (End of file)
Zum Speichern von mms://
-Streams können auch die Kommandozeilen-Programme Archiv/mimms und mmsrip genutzt werden.
RTSP-Streams aufnehmen¶
FFmpeg¶
rtsp://
-Streams lassen sich sehr einfach mit FFmpeg bzw. avconv (aus dem Libav-Projekt) über ein Terminal[3] aufnehmen. Dabei werden Audio- und Videostreams in eine Containerdatei kopiert (also ohne sie zu re-encodieren). Der Befehl[3] dafür lautet allgemein:
ffmpeg -i rtsp://Adresse -acodec copy -vcodec copy /Pfad/zur/Zieldatei.mp4
Man kann die Aufnahme mit der Tastenkombination Strg + C stoppen. Bei On-Demand-Streams geschieht dies am Ende automatisch.
Siehe auch den Abschnitt HLS (HTTP Live Stream) aufnehmen sowie den hierfür als Quelle verwendeten Link How to dump raw RTSP stream to file? 🇬🇧.
MPlayer¶
rtsp://
-Streams lassen sich ebenfalls sehr einfach mit MPlayer über ein Terminal[3] aufnehmen. Das Verfahren funktioniert im Prinzip genauso wie bei MMS-Streams aufnehmen, jedoch muss man allgemein natürlich mms://
durch rtsp://
ersetzen und:
bei direkten
rtsp://
-Streams .wmv durch .rm bzw. .mp4, sowiebei indirekten
rtsp://
-Streams .asx durch .mov
Man kann die Aufnahme mit der Tastenkombination Strg + C stoppen. Bei On-Demand-Streams geschieht dies am Ende automatisch.
Stream-Download und ggf. Umwandlung mit VLC¶
Mit VLC kann man einen Stream speichern und ggf. gleichzeitig in ein anderes Video- bzw. Audioformat umwandeln.
GUI¶
Live-Streams¶
VLC bietet die Möglichkeit, Radio- und Fernsehstreams abzuspielen. Dazu die Internet-Adresse des Radiostreams in die Zwischenablage kopieren und in "Medien → Netzwerkstream öffnen → Netzwerk" ( Strg + N ) im Feld "Adresse" einfügen. Anschließend muss man die "Wiedergabe-Taste" drücken, die sich unten befindet. Alternativ kann die Funktion "URL aus Zwischenablage öffnen" ( Strg + V ) verwendet werden.
Stream-Aufnahmen und "Time-Shift"¶
Auch das Aufnehmen von Streams und "Time-Shift" sind problemlos möglich. Dazu im Hauptfenster im Reiter "Ansicht → Erweiterte Steuerung" aktivieren. Es erscheinen weitere Bedienelemente, u.a. ein roter Aufnahme-Knopf. Aufnahmen werden mit dem Präfix vlc-record- sowie unter Angabe der Zeit und der Stream-Adresse im Homeverzeichnis (~/Downloads/) des Benutzers in streamart-spezifischen Datei-Typen (z.B. .mp4 oder .ts) abgelegt. Ein benutzerdefinierter Ort lässt sich über "Werkzeuge → Einstellungen → Input/Codecs" unter "Files → Aufnahme-Verzeichnis oder Dateiname" festlegen. Manchmal ist Letzteres sogar ein Muss weil kein Aufnahme-Verzeichnis voreingestellt ist und somit auch nichts aufgenommen wird!
Wenn man bei laufender Sendung den Pause-Knopf betätigt, wird die Wiedergabe unterbrochen. Ein erneutes Drücken lässt den Stream an der angehaltenen Stelle weiterlaufen. Nach Beenden des Players werden auch die während des Pausierens angelegten temporären Dateien gelöscht. "Time-Shift" ist auch in Verbindung mit der Aufnahme-Funktion möglich.
On-Demand-Streams¶
Über "Medien → Konvertieren/Speichern" kommt man zum Reiter "Netzwerk", wo man die Stream-Adresse einträgt. Nach dem Klick auf "Konvertieren / Speichern" öffnet sich ein Fenster, in dem man zum einen den Speicherort bestimmen und zum anderen auswählen kann, ob man bloß den "Raw-Input speichern" oder zusätzlich auch noch "Konvertieren" möchte. Bei der letzteren Möglichkeit kann man das gewünschte Video- bzw. Audioformat bestimmen.
Terminal¶
Streams lassen sich mit dem VLC-Player auch über ein Terminal[3] aufnehmen und ggf. gleichzeitig in ein anderes Video- bzw. Audioformat umwandeln. Es gibt verschiedene Syntax-Möglichkeiten:
vlc URL-DES-STREAMS --sout=Videos/Datei.mp4
vlc -v URL-DES-STREAMS --sout=file/mp4:Videos/Datei.mp4
vlc -v URL-DES-STREAMS --sout="#std{access=file,mux=mp4,dst=Videos/Datei.mp4}"
-v
sowie-vv
und-vvv
sind die Verbose-Level von VLC bzw. cvlc und erhöhen damit auf der Kommandozeile entsprechend die Anzahl der ausgegebenen Programmaktivitätsinformationen (optional).sout=
lässt den Speicherort, den Namen und das Format der Aufnahme festlegen. Es werden hier Beispiele von verschieden ausführlichen Schreibweisen gezeigt.file/mp4
bedeutet, dass die Ausgabe im MPEG4-Format in eine Datei geschrieben wird.Videos/Datei.mp4
bedeutet, dass es die Ausgabe-Datei Datei.mp4 im Verzeichnis ~/Videos im Home-Verzeichnis ist.
vlc
lässt den VLC-Player ein Fenster öffnen und den Aufnahmefortschritt anzeigen. Möchte man hingegen kein VLC-Player-Fenster, so kann mancvlc
anstellevlc
nehmen.cvlc
lässt einen den Aufnahme-Fortschritt aber nur indirekt über einen Dateimanager beobachten!vlc
/cvlc
müssen mit der Tastenkombination Strg + C beendet werden. Die optionale--play-and-exit
-Option sorgt dafür, dass VLC / cvlc nach der Aufnahme des Tracks automatisch beendet wird.
Bei den vorangegangenen Befehlen wurde der Stream immer auch transkodiert, selbst wenn er schon im gewünschten Format vorlag. Möchte man dies unterbinden, so bietet sich dazu der folgende Befehl an:
vlc -v URL-DES-STREAMS --sout="#file{dst=Videos/Datei.mp4} sout-keep"
Hinweis:
Bei
vlc
sollte man tunlichst im VLC-Fenster die Steuerungs-Option "Liste bzw. Einzelstück wiederholen" deaktivieren weil ansonsten der Stream nach kurzer Pause erneut heruntergeladen wird, wobei die bereits vorhandene Datei ohne Rückfrage überschrieben wird! Daran ändert auch nichts die optionale--play-and-exit
-Option. Abhilfe schafft aber zuverlässig das Options-Doppel--no-repeat --no-loop
.Um eventuell noch an zusätzliche Terminal-Optionen zu kommen – besonders wenn man auch transkodieren will – bietet sich die Hilfe der GUI an. Hier bei superuser.com 🇬🇧 existiert eine sehr gute Anleitung dafür.
Informationen zu den heruntergeladenen Streaming-Dateien anzeigen¶
Möchte man lediglich den Dateitypen von Streaming-Dateien anzeigen, so eignet sich dafür das Programm file. Um neben den traditionellen menschenlesbaren Zeichenketten auch noch den MIME-Typ zu bekommen, muss man die beiden folgenden Kommandozeilen-Befehle separat verwenden:
file -k /Pfad/zur/Zieldatei
wobei das -k
für "keep-going" (weitersuchen nach dem ersten Treffer) steht, sowie
file -k --mime /Pfad/zur/Zieldatei
wobei das -k
für "keep-going" (weitersuchen nach dem ersten Treffer) und das --mime
für "Ausgabe des MIME-Types" steht.
Um die technischen und Metadaten von Video- und Audiodateien anzeigen zu können gibt es die Programme MediaInfo, ffprobe
(aus dem FFmpeg-Projekt) sowie Archiv/avprobe (aus dem Libav-Projekt). Sie erkennen zahlreiche Audio-, Video- und Container-Formate. Die Programme stehen als kommandozeilen-basierte Anwendungen zur Verfügung, MediaInfo optional auch mit einer GTK-basierten grafischen Benutzeroberfläche (GUI).
Programmkennung ändern¶
In einem Terminal[3] gelten die folgenden Befehls-Muster:
wget:
wget -U "MSDL (compatible; LG NetCast.TV-2011) HbbTV/1.1.1 (; LGE; GLOBAL_PLAT3; 1.0; 1.0;)" http://example.com/folder/file
ffmpeg -headers $'User-Agent: "FMLE/3.0 (compatible; FMSc/1.0)"\r\n' -i http://Adresse.m3u8 -codec: copy /Pfad/zur/Zieldatei.mp4
Wobei das \r\n
den Zeilenvorschub (auch CRLF genannt) darstellt. Ohne diesen würde der Befehl folgendermaßen lauten:
ffmpeg -headers 'User-Agent: "FMLE/3.0 (compatible; FMSc/1.0)"' -i http://Adresse.m3u8 -codec: copy /Pfad/zur/Zieldatei.mp4
Siehe auch den Programmkennung ändern.
Links¶
Intern¶
Streaming Grundlegendes zum Thema; Audio- und Videostreams mit Browser-Plugins abspielen
Streams speichern Übersichtsartikel
Internetradio Übersichtsartikel
Internet-TV Übersichtsartikel