Vorwort
Wenn ein bestimmter Pfad oder Weg von vielen benutzt wird, wird er auch breiter und besser ausgebaut.
Das selbe Prinzip trifft auch in der Computerwelt zu. In diesem Fall redet man vom Programmpfad oder code path. Ein viel benutzter code path ist besser getestet und in der Regel auch besser unterstützt.
Seit einiger Zeit beschäftige ich mich mit der Video/Audiokommunikationsproblematik unter Linux (aber ich bin kein Kernentwickler von irgend welchen betroffenen Teil des code path). Kurz gesagt, das Problem des Linux ist gleichzeitig sein Vorteil, also die bunte Auswahl von Programmen und Pfaden. Als ich beschlossen hatte, etwas zu der Lösung des Problemes beizutragen, mußte ich mich entscheiden welchen Weg ich gehen will.
Wenn man die Route meiner Wahl beschreiben will, dann sieht es folgendermassen aus:
Webcam -> kernel-uvcvideo -> kernel-v4l2 -> gst-v4l2 -> gst-vp8enc -> gst-rtpvp8pay -> telepathy - empathy -> gst-rtpvp8depay -> vp8dec -> display
Wenn man der Pfadlogik immer noch folgt, kommt man zu der Schlußfolgerung, daß jede einzelne Stufe dieses Weges auch anderswo angewendet sein sollte. Die folgende Skizze soll es besser reflektieren:
Mit grün habe ich die Teile markiert die ich mehr oder weniger gut getestet habe und manchmal auch erweitert.
Als Kerncodec meines Weges hab ich den vp8 genommen. Aus folgenden Grund: Für ein Videochat kämen drei Codecs in Frage: x264, theora und vp8. x264 wird in der Regel bei google talk eingesetzt. Der aber kommt nicht in Frage wegen der Lizenzdiskrepanzen. Also man mußte es immer nach installieren und so weiter... Den Zug mit Theora haben wir schon verpaßt. Vp8 wird immer noch intensiv von google gepflegt und man soll die Gelegenheit nutzen um nicht die gleichen Fehler wie mit Theora zu machen. Das Problem mit dem Vp8 Codec ist folgender: Weil viele glauben, dass ausschließlich google daran arbeitet, wird es für Adoption und Erweiterung zu wenig gemacht, wenn überhaupt. Google arbeitet nur an libvpx, der Library selbst. Die Integration in die Opensource Projekte ist dem Opensource überlassen. Deswegen ist die Lage von vp8 nicht so optimal. Nun um die Lage mit Videochat zu verbessern habe ich beschlossen so viel wie möglich zu tun um vp8 in den Alltag zu bringen.
Mein erstes Ziel war alle dvd die ich besitze als webm/vp8 zu speichern. Dadurch wurden einige Bugs entdeckt und einige Erweiterungen entstanden. Alle sind herzlich eingeladen diesen Pfad auch zu nutzen. Dafür wird man aber die neueste Version der gstreamer brauchen.
Hier ist ein Beispiel wie man ein Backup von einer DVD macht. (ich trage keine Verantwortung für illegale Nutzung): zu erst soll man am besten einen dvd dump machen. Der wird nur einige Minuten dauern und wird ungefähr 4 GB groß:
mplayer dvdnav://1 --dumpstream
Viele modernen dvds kann man nur mit dvdnav abspielen (ein älteres, anscheinend nicht mehr gepflegtes plugin für mplayer). Die Nummer die danach folgt wird oft vertuscht, deswegen soll man zu erst ohne - -dumpstream testen ob es geht.
Manchmal befindet sich das Hauptvideo irgendwo im dvdnav://64, also testen.
Danach kommt der Inhalt aus meinen Skript:
gst-launch filesrc location=stream.dump ! mpegpsdemux name=demux webmmux name=mux ! filesink location=out_audio.webm demux.audio_80 ! a52dec mode=2 ! audiorate tolerance=50000000 ! audioconvert ! audioresample ! audio/x-raw-float,rate=44100,channels=2 ! taginject tags="language-code=eng" ! queue ! vorbisenc ! mux. demux.audio_81 ! a52dec mode=2 ! audiorate tolerance=50000000 ! audioconvert ! audioresample ! audio/x-raw-float,rate=44100,channels=2 ! taginject tags="language-code=ger" ! queue ! vorbisenc ! mux.
hier wandeln wir zwei Audiospuren gleichzeitig und fügen die Tags zu, die die Sprache bezeichnen.
gst-launch filesrc location=stream.dump ! mpegpsdemux name=demux demux.video_e0 ! mpeg2dec ! ffmpegcolorspace ! videorate ! vp8enc threads=3 multipass-mode=1 bitrate=1500000 ! fakesink
hier machen wir einen ersten Durchgang für Video
gst-launch filesrc location=stream.dump ! mpegpsdemux name=demux webmmux name=mux ! filesink location=out_video.webm demux.video_e0 ! mpeg2dec ! ffmpegcolorspace ! videorate ! vp8enc threads=3 multipass-mode=2 bitrate=1500000 auto-alt-ref-frames=1 speed=0 max-keyframe-distance=360 min-quantizer=0 max-quantizer=60 lag-in-frames=16 minsection-pct=5 maxsection-pct=800 ! queue ! mux.
Hier machen wir den zweiten Pass. Es wird viele Stunden dauern. Danach haben wir zwei Dateien: out_audio.webm und out_video.webm Die sollen wir zusamen mischen mit folgenden Befehl:
mkvmerge --webm -o out.webm out_audio.webm out_video.webm
Achtung nur neueste Software nutzen, sonst trifft man alle alte Bugs die ich schon beseitigt hatte.
Bei Ubuntu 11.10 mitgelieferte gstreamer, libvpx und mkvtoolnix sind veraltet.
PS: Nutzen sie nie das “quality†Option des vp8enc und setzensie immer “bitrate†für DVDs und meisten anderen Sachen!
MfG Oleksij Rempel (Alexey Fisher)
FFmpeg hat schon lange einen eignen VP8 Dekoder,schneller als VP8 von Google. http://x264dev.multimedia.cx/archives/499 http://www.golem.de/1007/76717.html
Ich glaube das Google Talk H264 einsetzt und nicht X264.
Solange VP8 nicht an die Qualität von X264/H264 rankommt, würde ich meine Sammlung nicht in VP8 speichern. X264 als MKV können mittlerweile viele Bluray Player per USB abspielen.(Standalone).
Google garantiert nicht das VP8 patentfrei ist. Bedenke, selbst b-Frames sind patentiert.
Warum du umständlich über gstreamer gehst und nicht direkt mit ffmpeg arbeitest, ist mir ein Rätsel.
Also warum gstreamer und nicht ffmpeg? Weil gst mit fast jeden Distro mitgeliefert ist. Weil wegen der modulehre Struktur der ist immer noch da, auch wenn die Distroanbieter Bedenken wegen Lizenzen haben.
Wie ich schon sagte, mein Ziel ist an video und audio Kommunikationsinfrastruktur zu arbeiten. Dafür wurde viel Arbeit auch von anderen Entwickler geleistet. Willst du oder nicht, aber auch du wirst höchst wahrscheinlich es nutzen. Und es wird auch höchst wahrscheinlich auf gstreamer und telepathy basieren.
Anstelle jetzt eine weitere sinnlose Diskussion zu führen, schlage ich vor zu mitspielen. Einen Beitrag kann man leisten in dem man kritische Kodepfaden nutzt und Fellerberichte schickt. Noch besser, wenn man da noch mitentwickelt. Mit diesen Artikel versuchte ich ein möglichen Weg zu zeigen, wo man die kritische Teile des Pfades nutzt ohne sich mit Telekommunikation zu beschäftigen (wahrscheinlich sollte ich auch so schreiben, gute Gedanken kommen leider zu spät
)
Hallo,
finde Deinen Artikel sehr interresant! Ich habe mal eine Frage bezüglich Gstreamer.
Hier der code:
Wie bekomme ich jackaudiosrc und v4l2 syncron? oder wo baue ich die option sync=false oder true ein? Wäre für einen Tipp dankbar
MfG Ralf
Hi, so bald etwas in gstreamer rein geht, kriegt es einen Timestamp. Dies wegen gibt es, in der Regel kein spürbare unterschied. Aber es hat mir etwas aufgefallen. Versuche folgende Optionen zu diesen Elementen: videorate skip-to-first=1 theoraenc speed-level=2
Danke für den Tip!!!! ist zwar nicht 100% aber 95%
passt so, Super, merci!!! Wesentlich besser als vorher, Danke!
Wahrscheinlich liegt es auch ein wenig daran, das ich jackaudiosrc im jack connectionkit etwas später mit Hand verbinde.
MfG Ralf