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. 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