Table of Contents

Videos umwandeln mit dem GStreamer Framework

GStreamer?

GStreamer ist ein Video-Framework, das eigentlich Anwendungsentwicklern helfen soll, mit Multimediaformaten umzugehen. Mithilfe von gst-launch kann man aber das in viele Plugins zerlegte Framework auch so nutzen. Jedes Plugin hat eine/mehrere “source” und einen/meherere “sink”. So kann man die ganzen Plugins in eine Kette hängen, angefangen vom lesen einer Datei, über das umwandeln des Videos und dem Muxen über das speichern in eine Datei

Installation

Sollte auf den meisten Linux-Distributionen über die gst-plugins-[good,bad,ugly] (oder ähnlich) Pakete gehn. OS X hat bestimmt irgendnen Port. FIXME Windows?

Informationen über Plugins

  gst-inspect

Alleine aufgerufen listet die installierten Plugins auf. Mag man z.B wissen was das “vorbisenc” denn alles verwursten kann, gibt man

  gst-inspect vorbisenc
  

ein.

Beispiele

Praktische Decodebins!

gst-launch-0.10 filesrc location="Downloads/tues_11_16.flv" ! decodebin name=dec  dec. ! ffdec_flv ! videoscale method=2 ! video/x-raw-yuv,width=853,height=480 ! vp8enc threads=2 mode=vbr ! webmmux name="mux" ! filesink location=honcast.webm  dec. ! audioconvert ! vorbisenc quality=0.2 ! queue ! mux.audio_0

DVD -> WebM

gst-launch-0.10 dvdreadsrc title=1 ! dvddemux name=demux  demux.current_video ! queue ! mpeg2dec ! vp8enc threads=2 quality=8 speed=0 max-latency=25 mode=vbr ! queue ! webmmux name="mux" ! filesink location=oceans11.ivf  demux.current_audio ! queue ! a52dec mode=2 ! vorbisenc quality=0.4 ! queue ! mux.audio_0

Speichert den ersten Titel einer DVD im WebM Format ab - also VP8 als Videocodec und Vorbis als Audiocodec. VP8 ist der derzeit beste freie Videocodec, und auch der einzige freie Videocodec der mit h264 in einer Liga spielt. GStreamer unterstützt den Codec und den WebM Container seit dem 31.05.2010 ( gst-plugins-good 0.10.23, gst-plugins-ugly 0.10.15, gst-plugins-bad 0.10.19 ), noch werden nicht alle Optionen des VP8-Videocodecs über GStreamer angeboten. Die Optionen für VP8 sind auf der Website des WebM-Projekts erklärt, die von GStreamer anpassbaren findet man über gst-inspect vp8enc

DVD -> MKV (high-quality x264 + vorbis)

gst-launch-0.10 dvdreadsrc title=1 ! dvddemux name=demux  demux.current_video ! queue ! mpeg2dec ! x264enc quantizer=25 threads=2 pass=qual me=2 subme=6 ref=6 b-pyramid=true weightb=true ! queue ! matroskamux name="mux" ! filesink location=oceans11.mkv  demux.current_audio ! queue ! a52dec mode=2 ! vorbisenc quality=0.4 ! queue ! mux.audio_0

Speichert den ersten Titel einer DVD als h264 Video und Vorbis Audio in einem MKV. Der x264-encoder hat recht viele Features an, das .mkv wird also nicht auf schwachen Systemen abspielbar sein, dafür braucht die gewünschte Qualität ( wird über die “quantizer” funktion angepasst ) sehr wenig Platz. Die ganzen Optionen sind im Handbrake wiki schön erklärt.

PNGs+FLAC -> WebM

  gst-launch-0.10 webmmux name="mux" ! filesink location=test.ivf . multifilesrc location="/home/brot/sintel_trailer-720/sintel_trailer_2k_%04d.png" index="1" caps="image/png,framerate=24/1" ! pngdec ! ffmpegcolorspace ! video/x-raw-yuv,format=\(fourcc\)I420 ! vp8enc threads=2 quality=8 speed=0 max-latency=25 mode=vbr ! multiqueue ! mux. filesrc location="/home/brot/sintel_trailer-720/sintel_trailer-audio.flac" ! flacdec ! audioconvert ! vorbisenc quality=0.25 ! mux.
  

Um Videocodecs zu testen kommen teilweise PNG's zum einsatz, um sich nicht Arteafakte vorheriger Videocodecs einzufangen.

Anmerkung: Am Anfang wird der filesink definiert, mit dem namen “mux”. Danach kommt die Video- und die Ton-Pipeline, die beide mit “mux.” aufhören, was den Stream durch den webmmuxer in den filesink leitet.

y4m -> WebM

gst-launch-0.10 webmmux name="mux" ! filesink location=test.ivf . filesrc location="sunflower.y4m" ! ffdemux_yuv4mpegpipe ! vp8enc threads=2 quality=8 speed=0 max-latency=25 mode=vbr ! multiqueue ! mux.

Manchmal kommen zum testen auch y4m Videos zum Einsatz, was im Endeffekt die YCbCr Einzelbilder in einem mpeg-Container sind

Ablage ;)

abspielen der ip-webcam (android webcam dingen)

 gst-launch-0.10 -v souphttpsrc location="http://10.10.14.113:8080/videofeed" do-timestamp=true ! multipartdemux ! image/jpeg, width=640,height=480, framerate=15/1 ! jpegdec ! ffmpegcolorspace ! ximagesink

mkv -> shoutcast+local

 gst-launch-0.10 --eos-on-shutdown filesrc location=/media/input.mkv ! queue ! matroskademux name="input" input. ! queue ! decodebin ! ffvideoscale method=2 ! video/x-raw-yuv, width=640, height=360 ! tee name=vdec ! queue ! theoraenc bitrate=451 ! queue ! oggmux name="mux" mux. ! queue max-size-bytes=100000 max-size-time=1 ! shout2send ip=minad.de port=8000 password=minadrulez mount=/brot.ogg streamname='brot' input. ! queue ! decodebin ! tee name=adec ! audioconvert ! vorbisenc ! queue ! mux. vdec. ! queue ! xvimagesink adec. ! queue ! pulsesink

webcam -> shoutcast

time gst-launch-0.10 --eos-on-shutdown v4l2src ! 'video/x-raw-yuv, format=(fourcc)YUY2, width=640, height=480, framerate=15/1' ! queue max-size-bytes=100000000 max-size-time=0 ! ffmpegcolorspace ! theoraenc bitrate=300 ! oggmux ! tee name=ogged ! queue max-size-bytes=100000000 max-size-time=0 ! oggdemux ! theoradec ! xvimagesink sync=false force-aspect-ratio=true ogged. ! queue max-size-bytes=100000000 max-size-time=0 ! filesink location=`date +%F_%T`.ogv ogged. ! queue max-size-bytes=100000000 max-size-time=0 ! shout2send ip=media.basilgohar.com port=8000 password=**** mount=/basil-at-work.ogv streamname='Basil at Work' description='Live video stream of me at work' genre='Webcam' url='http://media.basilgohar.com/stream/' ogged.

DVD's Abspielen

gst-launch-0.10 dvdreadsrc title=1 ! dvddemux name=demux demux.current_audio ! queue ! a52dec ! audioconvert ! pulsesink demux. ! mpeg2dec ! xvimagesink

DVDs umwandeln und eine falsche 4:3 aspect ratio korrigieren

gst-launch-0.10 dvdreadsrc device=/home/nudelundbrot/einsteins_2010_.iso title=1 ! dvddemux name=demux  demux.current_video ! queue ! mpeg2dec! postproc_cubicipoldeint ! ffvideoscale method=2 ! video/x-raw-yuv, width=512, height=288 ! theoraenc quality=25 drop-frames=false ! queue ! oggmux name="mux" ! filesink location=einsteins2010.ogg  demux.current_audio ! queue ! a52dec mode=2 ! vorbisenc quality=0.2 ! queue ! mux.sink_1
gst-launch-0.10 dvdreadsrc device=/home/nudelundbrot/einsteins_2010_.iso title=1 ! dvddemux name=demux  demux.current_video ! queue ! mpeg2dec ! deinterlace ! ffvideoscale method=2 ! video/x-raw-yuv, width=1024, height=576 ! vp8enc threads=2 quality=6 speed=0 max-latency=25 mode=vbr ! queue ! webmmux name="mux" ! filesink location=einsteins2010.webm  demux.current_audio ! queue ! a52dec mode=2 ! vorbisenc quality=0.4 ! queue ! mux.audio_0

Sonstiges

 gst-launch-0.10 multifilesrc location=big_buck_bunny_%05d.png index=1 caps=”image/png,framerate=24/1″ ! pngdec ! ffmpegcolorspace ! jpegenc quality=100 ! queue ! mux. filesrc location=../BigBuckBunny-stereo.flac ! flacdec ! audioconvert ! audioresample ! queue ! mux. avimux name=mux ! filesink location=input226_mjpeg.avi
 gst-launch-0.10 v4l2src device=/dev/video0 ! tee name=videoout ! queue ! video/x-raw-yuv,width=640,height=480 ! queue  ! theoraenc quality=30 ! muxout. osssrc device=/dev/dsp ! tee name=audioout ! queue ! audio/x-raw-int,rate=44000 ! queue ! audioconvert ! vorbisenc !  muxout. oggmux name=muxout ! filesink location=media2.ogg videoout. ! queue ! ffmpegcolorspace ! xvimagesink audioout. ! queue ! osssink

http://diracvideo.org/wiki/index.php/Encode_Big_Buck_Bunny

 gst-launch-0.10 v4l2src device="/dev/video1" ! image/jpeg,width=640,height=480,framerate=30/1 ! jpegdec ! queue max-size-time="500000" name=input1 v4l2src device="/dev/video0" ! image/jpeg,width=640,height=480,framerate=30/1 ! jpegdec ! queue name=input2 max-size-time="500000" ximagesrc use-damage=false ! ffvideoscale ! video/x-raw-yuv,width=1280 ! queue name=input3 max-size-time="500000" input1. ! videomixer2 name=mix sink_0::xpos=0 sink_1::xpos=640 ! queue name=asd1 max-size-time="500000" input2. ! mix. input3. ! ffmpegcolorspace ! finalmix.  asd1. ! videomixer2 name=finalmix sink_0::ypos=480 sink_1::xpos=0 ! queue max-size-time="500000" ! ffmpegcolorspace ! videorate ! video/x-raw-yuv,framerate=30/1 ! x264enc speed-preset="superfast" bitrate=4000 profile=3 tune="zerolatency" ! gdppay ! queue max-size-time="500000" ! tcpserversink host="10.10.1.58"
 
 gst-launch-0.10 v4l2src device="/dev/video1" ! image/jpeg,width=640,height=480,framerate=15/1 ! jpegdec ! videobox right=-640 ! queue max-size-time="500000" name=webcam1 v4l2src device="/dev/video2" ! image/jpeg,width=640,height=480,framerate=15/1 ! jpegdec ! queue name=webcam2 max-size-time="500000" ximagesrc use-damage=false ! ffvideoscale ! video/x-raw-yuv,width=1280 ! queue name=desktop max-size-time="500000" webcam1. ! videomixer name=webcammix sink_0::xpos=0 sink_1::xpos=640 ! queue name=webcams max-size-time="500000" webcam2. ! webcammix.  webcams. ! videobox bottom=-800 border-alpha=0 fill=white ! videomixer name=finalmix sink_1::ypos=800 sink_0::xpos=0  ! queue max-size-time="500000" ! ffmpegcolorspace ! videorate ! video/x-raw-yuv,framerate=15/1 ! x264enc speed-preset="superfast" bitrate=2000 profile=3 tune="zerolatency" ! gdppay ! queue max-size-time="500000" ! tcpserversink host="0.0.0.0" desktop. ! ffmpegcolorspace ! finalmix. pulsesrc device="alsa_input.usb-046d_0821_F4E863A0-00-U0x46d0x821.analog-stereo" provide-clock=false ! audioconvert ! vorbisenc ! gdppay ! queue max-size-time="500000" ! tcpserversink host="0.0.0.0" port=4954