Video Streaming mit freier Software
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Video Streaming mit freier Software http://etherpad.servus.at/p/streamdoku Permission is granted to copy, distribute and/or modify this document under the terms of any of the following licenses: (1) the GNU General Public License as published by the Free Soft- ware Foundation; either version 2 of the License, or any later version. To view a copy of this license, visit http://www.gnu.org/copyleft/ gpl.html or send a letter to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. (2) the GNU Free Documentation License as published by the Free Soft- ware Foundation; either version 1.2 of the license or any later version. To view a copy of this license, visit http://www.gnu.org/copyleft/ fdl.html or send a letter to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. (3) the Free Art License; either version 1.3 of the license or any later version. To view a copy of the license, visit http://artlibre.org/ licence/lal/en/ Any of the trademarks, service marks, collective marks, design rights, personality rights or similar rights that are mentioned, used or cited in this book are the property of their respective owners. Their use here does not imply that you may use them for any other purpose other than for the same or a similar informational use as contemplated by the original authors under the GFDL licensing scheme.
1 Streaming Workshop with Christian Pointner 1 Streaming Workshop with Christian Pointner 1.1 Christian Pointner • Funkfeuer • mur.at • Radio Helsinki -> live video streaming Elevate Festival 1.2 Teilnehmer • Peter Wagenhuber • Ushi Reiter • Markus Decker • Ufuk Serbest • Christoph Haag • Stefan Hageneder 2 Grundlagen 2.1 Live vs. On-Demand Streaming On-Demand Gewisse Header und ein Index sind beim On-Demand Streaming, im Gegensatz zum Live Streaming, vorhanden, weil bestimmte Informationen wie z.B. die Länge schon vorliegen. Oft wird die Downloadrate von der Serversoftware allerdings begrenzt, daher sieht es für den Client einem “echten” Livestream sehr ähnlich. Praktische Beispiele für On-Demand Streaming: Youtube, Vimeo, diverse Mediatheken. Achtung bei der Auswahl der Streamingsoftware: Manchmal wird On-Demand Streaming fälschlicherweise als “Live” Streaming bezeichnet. Live Da beim Livestreaming kein Index vorhanden ist und damit keine Informationen z.b. über die Länge der Datei vorliegen, macht das bei manchen Clients wie z.b. Inter- net Explorer Probleme. Hier ist leider immer noch ein Rückgriff auf einen Flashplayer notwendig. Das gleiche “Problem” stellt sich beim direkten Dump des Streams für Archivzwecke dar. D.h. Files ohne Information über die Länge des Files können nicht ohne weiteres von Software-Mediaplayer abgespielt werden. Es ist daher notwendig die Archive-files mit der dafür notwendigen Zeitinformation auszustatten > zb. klassis- che Aufnahme via Videosoftware usw. anstatt des direkten Dump. Manche Stream- ingformate wie zb HLS haben dieses Problem aufgrund der spezifischen Medien(File) Distributions Technik nicht, s.u. 3
Ethernet Switch HDMI -> SDI Konverter (100Mbit/s) SDI -> HDMI Konverter HDMI Repeater KVM Switch HDMI Splitter Kamera Ethernet Switch (Gbit/s)
2 Grundlagen 2.2 Kameras und Hardware als Grundlage für Qualität Kameras Die Streaming-Qualität ist abhängig von Kamera und Lichtsituation. Ein Live-Stream mit einer Konsumerkamera im Innenbereich liefert meistens unbefriedigende Ergeb- nisse Warum: Das Videobild ist meistens körning (Noiseratio) und produziert mehr Rauschen. Das hat eine unmittelbare Auswirkung auf den Encoder und das heisst mehr CPU-Zeit verbauch und auch mehr Bandbreite da sich Rauschen nicht kom- primieren lässt. Für den Innenbereich muss man diesen Fehler durch zusätzliches Licht, Licht-Regie und bessere Kameraobjektive ausgleichen. Im Aussenbereich und am Tag funktionieren Konsumerkameras meist gut bzw. ausreichend. Kabel • Standard für Video-Streaming: SDI (75 Ohm Koax Kabel), Übertragung über lange Wege möglich ( rund max. 200m ) • Mit Vorsicht zu geniessen: HDMI Kabeln, Übertragung bis zu maximal 10m! • Achtung Kabelführung: Beim Verlegen von Video-Kabeln ist die Nähe von Stromkabeln (Lichtverkabelung, Netzwerkkabeln, etc) zu vermeiden! Sie bere- itet Probleme und kann beim Live-Stream zu Bild-Aussetzern führen und den Stream unterbrechen . Der Grund ist die meist schlechte Abschiermung von den für den Zweck verwendeten SDI (75 Ohm Koax Kabel) Kabeln. Generell ist die Sinalqualität bei langen Kabeln immer zu prüfen. Videomischer vs. Video-Hub Zwischen Empfangen und Verarbeiten von Video-Signalen zu einem Stream ist ein Videomischer von Vorteil. Er liefert Kontinuität, weil die gesamte Information Frame per Frame transportiert wird. Unterbrechungen des Streams können so verhindert werden, da der Videomischer auch wenn kein Frame anliegt das Signal aufrecht er- hält (Schwarzbild) Bei einem Video-Hub kann es beim Umschalten zu kurzzeitigen Signalabbruch kommen. Best Practise Hardware: Gute Erfahrungen wurden mit Hardware (Videomischer) von der Firma “Black Magic Design” gemacht. Empfehlung: Decklink SDI, Intensity Pro, Mini Recorder • Vorteile: Preis, Linux-Support • Nachteile: Proprietäre Treiber Wichtige Tips: • Schnittregie trennen vom Streaming. Sie ist verantworlich auch diverse Eingangs-Signale für die Postproduktion aufzuzeichnen. • Mehr an verschiedenen Stellen - Kamera, Stream,.., zu Recorden ist nie ein Fehler. • Bei der Planung muss man div Standards einführen. Es ist ratsam, gleiche Bild- und Audio- Standards einzuführen und auf allen Geräten einzuhalten! 5
2.3 Formate/Codec/Protokolle • H264 – proprietär (x264 Opensource Implementierung) – Clients: iPad, iPhone (h264 im Baseline Profil) • VP8 – royality free – Clients: Android, Firefox, Chromium/Chrome, Opera, diverse Player wie VLC, mplayer, . . . . – Bitraten-Einstellungen von VP8 sind etwas trickreich. Nie unter 50% der Bitrate von GOP für Keyframe Keyframes (Frames die das Gesamtbild beschreiben ) sind eine wichitige Komponente im Stream, die Buffergrösse wird dadurch mit definiert und je nach Bewungsintensität im Bild muss die Keyframerate angepasst werden. In etwa kann man sagen eine Keyframerate von 50 Frames (2sec bei 25FpS) sind ausreichend. (== 2sec minimal Buffer, 2 Keyframes sollten im Buffer enthalten sein dh 4 sec Bufferzeit ist ideal ). Ein gutes Streamingsetup sollte zumindest die 2 Formate VP8 und H264 aufgrund der guten Client unterstützung bieten. funktionierende Containerformate Containerformate kümmern sich um das Synchrone abspielen der unterschiedlichen Streams, d.h. Audio, Video, Subtext. Unter http://caniuse.com/#feat=video gibt es eine Auflistung welche Browser welche Formate seit welcher Version unterstützen. Im Normalfall braucht man aktuell nur noch 2 Formate: H264 + AAC in MP4, VP8 + Vorbis in WebM. Alle gängigen Browser können zumindest eines dieser Formate abspielen. Bei den Live Streams siehts da leider etwas anders aus. Da Mpeg-4 zwar theoretisch Live Streams muxen kann aber es defacto keine Implementierung gibt die damit umgehen kann, müssen bei echten Live Streaming andere Formate verwendet werden, wie zb.: • flv (http://en.wikipedia.org/wiki/Flash_Video ) Flash Video ist zu vernachlaessi- gen und eine alte Technologie, einzig der IE benoetigt dieses Format noch, da der IE kein anderes Live Streamingformat abspielen kann. Man benötigt dafür Flash (zb.: flowplayer). • WebM (http://en.wikipedia.org/wiki/WebM ) HTML5 • HLS (http://en.wikipedia.org/wiki/HTTP_Live_Streaming ) .ts files, .m3u8 (Playlist file) HTML5, fuer alle mobilen Geraete. Aufgrund der Fragmen- tierung in einzelne zeitlich begrentzte Packte eignet sich dieses Format sehr gut fuer die Archivierung, da in diesen Fragmenten der Timecode inkludiert ist. Bei allen anderen Streamingformaten ist das nicht der Fall. Adaptive Bi- trating (http://en.wikipedia.org/wiki/Adaptive_bitrate_streaming) Nachteil: HLS schwierig zu monitoren. -burst on connect-, ist ein Feature im Streamingserver. Die Clients beginnen das Video quasi augenblicklich abzuspielen. > server push vom Videobuffer. Streaming- Server: Icecast und flumotion unterstützen burst on connect (Einstellung am Server ca 6 Sekunden) 6
2 Grundlagen 2.4 Archiv Formate Eine grosse Abdeckung der derzeitigen Browserlandschaft findet sich mit: h264 + aac in FLV (für Flash -> IE) und mpegts (für HLS) ( alternativ funktioniert mp4 auch in allen Browsern die h264 abspielen können und in Flash) vp8 + vorbis in WebM Eine generelle Archivierung der Videofiles wird hier nicht im Detail behandelt, einzig das sich jemand darum kümmern muss, und am besten mit einer Videosoftware aufgezeichnet wird die den Archivefile mit einem Timecode versieht. Gleichzeitig ist ein Streamdump als Backup ratsam. 2.5 Netzwerk Infrastruktur Bei Videostream Projekten kann eine grosse Bandbreite benötigt werden um die Clients zu versorgen. Eine ungefähr genaue Einschätzung der Benutzerinnenanzahl ist von Vorteil. Um grosse Bandbreiten kurzfristig und für einen kurzen Zeitraum billig nutzen zu können, bieten sich Mietserver und Leitungen diverser Serverfarmen an. Zwei Projekte können als ungefähre Aulastungs und Konfigurations Beispiele dienen: Das Elevate Festival nutz 2 Distributionsserver mit einer Bandbreite von ca. 100 MBit bei einem Userpeak von ca 100 Streams in den verschiednen Auflösungen (240p25, 360p25, 480p25, 720p25). Der CCC hingegen mit unbekannter Benutzerinnenzahl, hatte 2013 wesentlich mehr Bandbreite zur Verfügung und div. Distributionsserver extern verteilt. Die Erfahrung hat gezeigt das die Encodierung der einzelnen Streams besser vor Ort stattfinden soll und die gemieteten Server ausschliesslich zur Distribution verwen- det werden. Der Unterschied zwischen den beiden Distributions-techniken ist das man vor Ort das unkomprimierte Videosignal abnimmt und in die einzelnen Streams konvertiert, wohingegen am Server, der bereits komprimierte hochauflösende Stream rekodiert wird und sich daraus, eine schlechtere Videoqualitaet und eine hoehere Bandbreite der rekodierten Streams ergibt. Beide Artefakte will man im Normalfall vermeiden. Das Abwegen zwischen den beiden Distributionsformen, findet vor allem mit der vorhandenen Bandbreite vor Ort zum Server statt. Wählt man die zweite Vari- ante der Transkodierung am Server muss man vor allem darauf achten eine schnelle Cpu mitzubuchen. Protokolle: • Webstreaming über HTTP (1.1) • RT*P (Sessionmanagement von Daten getrennt) (RTSP für android < 3, RTMP für flash) • Dash.js wird die Zukunft 7
HD-SDI HD-SDI ZUSPIELER HDMI CONTROLLER VIDEOMISCHER HD-SDI ENCODER Gbit/s Flumotion ENCODER LOKAL EXTERN REPEATER STREAMER STREAMER STREAMER STREAMER CLIENTS
3 Gstreamer 3 Gstreamer Bei Gstreamer handelt es sich um ein modernes sehr modulares Multimedia Frame- work, das wie ein klassiches Signalverarbeitungssystem arbeitet: Quelle -> Konverter -> Filter -> Senke. Der Flumotion Server baut auf diesem Framework auf und bei di- versen Modifikationen ist es notwendig die jeweiligen Gstreamer-module manuel ein bzw umzubauen. Bin / pipeline Element Element Element (File plugin) (Decoder) (ALSA) Sink Sink Source Source Gstreamer bin ist sowas ähnliches wie ein subpatch http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section- bin-create.html 3.1 gstreamer-tools • gst-inspect: gibt alles moegliche aus was so da ist (alle plugins) – gst-inspect (optionen anzeigen) – e.g. gst-inspect alsasrc • gst-launch – ! = pipe operator – gst-launch alsasrc ! audioconvert ! vorbisenc ! oggmux ! filesink loca- tion=tmp.ogg – gst-launch audiotestsrc freq=1000 ! autoaudiosink – gst-launch audiotestsrc freq=1000 ! vorbisenc ! mux. videotestsrc ! vp8enc ! mux. matroskamux name=mux ! filesink location=tmp.mkv – gst-launch uridecodebin uri=http://live.helsink.at:8088/live160.ogg ! au- toaudiosink – http://linux.die.net/man/1/gst-launch-0.10 – GST_DEBUG=3 gst-launch audiotestsrc ! fakesink 2> tmp.log – gst-launch filesrc location=in.ogg ! decodebin2 name=decoder decoder. ! audioconvert ! lame ! muxer. decoder. ! ffmpegcolorspace ! x264enc ! muxer. matroskamux name=muxer ! filesink location=tmp.mkv • gst-launch audiotestsrc is-live=true freq=1000 ! audiotestsrc ! audio/x-raw- int,channels=2,rate=44100,depth=16 ! vorbisenc ! queue ! mux. videotestsrc is-live=true pattern=ball ! video/x-raw-yuv,height=720,width=1280 ! vp8enc ! queue ! mux. matroskamux name=mux ! filesink location=tmp.mkv 9
3.2 Flumotion (http://www.flumotion.net) flumotion ADMIN MANAGER MONITORING Konfiguration Steuerung WORKER WORKER WORKER COMPONENT COMPONENT COMPONENT COMPONENT COMPONENT DATEN DATEN SDI SCALER ENCODER REPEATER MUXER PULL PULL COMPONENT STREAMER Ist ein Open-Source Multimedia Streaming Server. Die Software ist in Python geschrieben und benutzt die Python Bindings von Gstreamer, darum ist dieser ähnlich modular aufgebaut. Unterschiedliche Aufgaben wie z.B. das Encodieren von Video werden von verschiedenen Komponenten erledigt und können auch auf mehrere Rechner verteilt werden. Damit ist es auch möglich unterschiedliche Formate und Auflösungen als Live-Stream anzubieten. Die Konfiguration zerfällt in die Konfiguration des Managers und des/der Worker. 3.3 Manager Verteilt und Monitored die Konfiguration und steuert die Worker. Die Konfiguration erfolgt im planet.xml File im Verzeichnis /etc/flumotion/managers. Das planet.xml besteht aus 2 Hauptteilen der atmosphere und dem flow, die beide components en- thalten. 10
3 Gstreamer atmosphere: Beherbergt Komponenten die nicht direkt an der Signalerzeugung oder Verarbeitung beteiligt sind. (Wer darf mit Wem Wie kommunizieren) flow: Beschreibt die Komponenten und den Datenfluss dazwischen: Wesentliche Arten von Kompo- nenten: * Producer: Streamquellen (SDI, Soundkarte, . . . ) * Converter: Bearbeiten Stream Daten. (konvertieren, muxen,. . . ) * Consumer: Sind lediglich Stream “Kon- sumenten”. (stellen z.B. einen Webstream zur Verfügung) 3.4 Worker Sind die eigentlichen “Arbeitstiere”. Die einzelnen Worker kommunizieren über TCP- Sockets. Verschiedene Komponenten können auf unterschiedliche Worker verteilt werden. (z.B. Encodieren und Multiplexen von unterschiedlichen Streams auf ver- schiedenen Rechnern) Manager und alle Worker sollten eine public IP haben. Aber, Vorsicht mit beim Rout- ing, NAT, und der Server kann kein IPv6! 3.5 Komponenten Der Datenfluss durch die Komponenten ist so organisiert, dass eine Komponente einen sog. feed zur Verfügung stellt von dem sich nachfolgende Komponenten die Daten abholen. (eater) Nachfolgende Komponente “holt” sich die Daten. Wenn mal ein “feeder” ausfällt dann wird die nachfolgenden Komponente die von diesem “feeder” isst (“eater”) “hungrig” (Status in der flumotion Administrations-GUI) Die Flumotion Administrations-GUI wird mit dem Befehl flumotion-admin gestartet und bietet Zugriff auf den Manager und die Worker. Die GUI ist in erster Linie zum mon- itoren der Komponenten nützlich. Es gibt auch die Möglichkeit über einen Wizard 11
eine neue Konfiguration zu erstellen, diese bietet aber nur sehr eingeschränkte Funk- tionalität. Als Startpunkt zum ersten Experimentieren ist dies aber trotzdem hilfreich. Für Komplexere Setups führt kein Weg am Editieren (oder mittels selbsgeschriebener Tools generieren) der XML Konfigurationsdateien vorbei. Ein hilfreiches Tool dabei ist flumotion-inspect. flumotion-inspect listet alle vorhandenen Komponenten auf wenn es ohne weitere Parameter aufgerufen wird. Wenn beim Aufruf von flumotion-inspect der Name einer Komponente als Parameter übergeben wird liefert das Tool nähere Informationen zu der jeweiligen Komponente. (ähnlich wie gst-inspect - siehe oben) Um SDI Karten als Input (Producer) zu verwenden gibts ein flumotion decklink plugin: http://cs.brown.edu/~jsb/flumotion/. 3.6 flufigut flufigut ist ein Python Script das die Erstellung, der doch sehr umfangreichen und schlecht zu editierenden planet.xml des Flumotion Servers, anhand von kleinen so- genannten .json config Files erleichtert. flufigut ist eine Entwicklung von Christian Pointner, das Repository ist hier http://git.spreadspace.org/?p=flufigut.git;a=summary zu finden. Im obigen Repository sind auch zusätzliche Flumotion Komponenten (im Verzeich- nis contrib/flumotion-components) zu finden. Diese Dateien müssen in das Verze- ichnis /usr/lib/flumotion/python/flumotion/component/ kopiert werden. Damit und dem pipeline-conveter ist es nun auch möglich mit der Open Source Version von flumotion Flash Streams mit h264 und AAC zu erstellen und den flv Stream per rtmp and einen RTMP Server (z.b. Nginx rtmp-module) zu schicken. Eine Beispielkonfiguration ist hier zu finden: http://git.spreadspace.org/?p=flufigut.git;a=tree;f=contrib/flumotion-sample-conf 3.7 alternative Streamingserver/Encoder Für den nginx Webserver http://nginx.org/, existiert ein https://github.com/arut/nginx- rtmp-module nginx rtmp Streaming Modul. Dieses Setup unterstützt auch IPv6. Der Nachteil bei diesem Server ist die Reduzierung der Streamingformate auf MPEG-4. Unterschützte Container und Protokolle: HLS, RTMP, Mpeg Dash RTMPD http://www.rtmpd.com/ Anderer Ansatz: Als Encoder dazu bietet sich der OpenBroadcastEncoder an http://www.obe.tv/. SDI-IN -> OB Encoder -> Multicast ( dieser Multicast kann mit ffmpeg dann an beliebige Streamingserver verteilt werden ) Nachteil: Retranscoding Vorteil: unterbrechungsfreier Output Stream. Mögliche alternative für CG overlay ( zu BM Videomischer) html5 editor für MLT Framework. https://github.com/inaes-tic/mbc-etiquette 3.8 -load balancing- an den Servern: Mit roundrobin-dns kann man die Anfragen auf die Verschiedenen Server verteilen, das reicht in den meisten Fällen aus. Bei HLS Streaming ist da allerdings Vorsicht geboten da man die laufend generierten Video-File-Fragmente auch zeitgleich auf die Rechner verteilen muss. Das kann man mit verschiedenen Filesystemen lösen, zb glusterfs. Siehe auch Flumotion Repeater weiter oben. 12
Unterstützt von:
Sie können auch lesen