ubuntuusers.de

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)

Paketliste zum Kopieren:

sudo apt-get install flvstreamer 

Oder mit apturl die Pakete installieren. Link: apt://flvstreamer

Für rtmpdump 🇬🇧 muss das folgende Paket installiert werden:[1]

  • rtmpdump (universe)

Paketliste zum Kopieren:

sudo apt-get install rtmpdump 

Oder mit apturl die Pakete 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 Meldung Unsupported 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-Filter aac_adtstoasc. In vorhergehenden Versuchen ohne diese Option hatte es nämlich die Fehlermeldung Malformed 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 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, sowie

  • bei 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 man cvlc anstelle vlc 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 bzw. avconv:

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.

Intern

Extern

Diese Revision wurde am 11. Februar 2020 08:37 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Howto