Difference between revisions of "video 4 linux 2 notes"

From Noah.org
Jump to navigationJump to search
 
(One intermediate revision by the same user not shown)
Line 13: Line 13:
 
== Gstreamer ==
 
== Gstreamer ==
  
Gstreamer is my favorite command-line tool for handling video.
+
See [[gstreamer]].
 
 
See also this [http://wiki.oz9aec.net/index.php/Gstreamer_cheat_sheet Gstreamer cheat sheet].
 
 
 
This will display the camera view in a window:
 
<pre>
 
gst-launch v4l2src ! ffmpegcolorspace ! autovideosink
 
# or
 
gst-launch v4l2src ! ffmpegcolorspace ! xvimagesink
 
</pre>
 
 
 
This will display the camera view in a window with a specified size (320x240):
 
<pre>
 
gst-launch v4l2src ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! xvimagesink
 
</pre>
 
 
 
Record video stream to a file using Motion JPEG encoding (MJPEG):
 
<pre>
 
gst-launch --eos-on-shutdown v4l2src ! ffmpegcolorspace ! jpegenc ! avimux ! filesink location=video.avi
 
</pre>
 
 
 
Record with fixed image size and frame rate.
 
<pre>
 
gst-launch --eos-on-shutdown v4l2src device="/dev/video0" ! video/x-raw-yuv,width=640,height=480 ! ffmpegcolorspace ! jpegenc ! avimux ! filesink location=video.avi
 
</pre>
 
 
 
1920x1080: This will have a low frame-rate since it will essentially max-out the USB bandwidth. It's useful for capturing individual frames without compression.
 
<pre>
 
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv,width=1920,height=1080' ! xvimagesink
 
</pre>
 
 
 
This will capture at a higher framerate, but it will undersample the pixels so you will get an effective 320x240 resolution.
 
<pre>
 
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv,width=640,height=480,framerate=60/1' ! xvimagesink
 
</pre>
 
 
 
Record video and display the stream at the same time requires '''tee''' to split the stream. Notice how the '''name''' parameter of '''tee''' refers to a label defined at the end of the command-line. Also notice how '''queue''' is necessary so that '''xvimagesink''' will run in parallel with the '''filesink'''. Without this you would record video but you would see a window with a single frozen frame of video.
 
<pre>
 
gst-launch --eos-on-shutdown v4l2src ! ffmpegcolorspace ! tee name=my_videosink ! jpegenc ! avimux ! filesink location=video.avi my_videosink. ! queue ! xvimagesink
 
</pre>
 
 
 
Video test pattern:
 
<pre>
 
gst-launch videotestsrc ! ffmpegcolorspace ! xvimagesink
 
</pre>
 
 
 
=== capture video with transparent overlay (picture in picture) ===
 
 
 
This will display the camera view with a semi-transparent overlay of random snow.
 
<pre>
 
gst-launch \
 
  videomixer name=mix sink_0::zorder=1 \
 
      sink_1::xpos=160 sink_1::ypos=120 sink_1::alpha=0.2 sink_1::zorder=2 ! \
 
      ffmpegcolorspace ! xvimagesink \
 
  v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640 ! ffmpegcolorspace ! mix.sink_0 \
 
  videotestsrc pattern="snow" ! video/x-raw-yuv, framerate=10/1, width=320, height=240 ! mix.sink_1 \
 
</pre>
 
 
 
=== capture video with transparent overlay (picture in picture) 2 ===
 
 
 
This will display a static PNG image in the foreground. Anywhere the static PNG image has alpha transparency the live video will show through behind the static image.
 
 
 
The '''TV.png''' file below will work, or any PNG image with transparency (an alpha channel) will work. The still image on the right shows what the video display window looks like after running this command.
 
 
 
[[Image:TV.png|frameless]] [[Image:noah_on_TV.png|frameless]]
 
 
 
<pre>
 
gst-launch \
 
  videomixer name=mix sink_0::zorder=1 sink_1::alpha=1.0 sink_1::zorder=2 ! ffmpegcolorspace ! xvimagesink \
 
  v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! ffmpegcolorspace ! mix.sink_0 \
 
  filesrc location=TV.png ! pngdec ! alphacolor ! ffmpegcolorspace ! imagefreeze ! mix.sink_1
 
</pre>
 
 
 
=== record two video cameras into side-by-side stereo video ===
 
 
 
<pre>
 
gst-launch v4l2src device=/dev/video1 ! videoscale ! ffmpegcolorspace ! video/x-raw-yuv, width=320, height=240 ! videobox border-alpha=0 left=-320 ! videomixer name=mixme ! ffmpegcolorspace ! jpegenc ! avimux ! filesink location=sbs-3d-video.mov v4l2src device=/dev/video2 ! videoscale ! ffmpegcolorspace ! video/x-raw-yuv, width=320, height=240 ! videobox right=-320 ! mixme.
 
</pre>
 
 
 
Using '''mplayer''' you can play side-by-side stereo video as anaglyphic stereo video.
 
<pre>
 
mplayer -vf stereo3d,scale -idx sbs-3d-video.mov -loop 0
 
</pre>
 
 
 
=== record video frames into separate files ===
 
 
 
<pre>
 
gst-launch --eos-on-shutdown v4l2src device=/dev/video1 ! video/x-raw-yuv,format=\(fourcc\)YUY2,width=640,height=480,framerate=30/1 ! ffmpegcolorspace ! videorate ! video/x-raw-rgb,framerate=30/1 ! ffmpegcolorspace ! pngenc snapshot=false ! multifilesink location="frame%05d.png"
 
</pre>
 
 
 
=== playback a collection of jpeg or PNG sill image files as a video (slideshow) ===
 
 
 
<pre>
 
gst-launch multifilesrc location="frame%05d.png" ! image/png,framerate=5/1 ! pngdec ! videorate ! video/x-raw-rgb,framerate=5/1 ! ffmpegcolorspace ! xvimagesink
 
</pre>
 
 
 
This works for JPEG images. This is very robust. It will skip errors when trying to decode a broken JPEG image. Then makes it easy to just dump in a whole bunch of unrelated images without having the stream die whenever it hits a bad image.
 
<pre>
 
gst-launch multifilesrc location="image%05d.jpg" ! jpegdec max-errors=-1 ! videoscale ! ffmpegcolorspace ! autovideosink
 
</pre>
 
 
 
=== mix two video sources into one (side-by-side) ===
 
 
 
<pre>
 
gst-launch v4l2src device=/dev/video1 ! videoscale ! ffmpegcolorspace ! video/x-raw-yuv, width=320, height=240 ! videobox border-alpha=0 left=-320 ! videomixer name=mix ! ffmpegcolorspace ! xvimagesink v4l2src device=/dev/video2 ! videoscale ! ffmpegcolorspace ! video/x-raw-yuv, width=320, height=240 ! videobox right=-320 ! mix.
 
</pre>
 
 
 
=== date and time stamps ===
 
 
 
The '''timeoverlay''' filter adds the frame buffer time to each video frame. The '''clockoverlay''' filter adds the date and time to each video frame.
 
<pre>
 
gst-launch -e v4l2src device=/dev/video1 ! video/x-raw-yuv,format=\(fourcc\)YUY2,width=640,height=480,framerate=30/1 ! ffmpegcolorspace ! timeoverlay shadow=false halignment=right valignment=bottom font-desc="sanserif 10" ypad=5 xpad=5 ! clockoverlay shadow=false halignment=left valignment=bottom time-format="%Y-%m-%d %H:%M:%S" font-desc="sanserif 10" ypad=5 xpad=5 ! videorate ! video/x-raw-rgb,framerate=30/1 ! ffmpegcolorspace ! xvimagesink
 
</pre>
 
 
 
=== interesting filters ===
 
 
 
<pre>
 
fpsdisplaysink
 
</pre>
 
 
 
=== gstreamer plugin documentation ===
 
 
 
Many Gstreamer plugins lack good documentation. You can find internal descriptions of plugins and their properties by using '''gst-inspect'''. For examples:
 
<pre>
 
gst-inspect timeoverlay
 
gst-inspect clockoverlay
 
</pre>
 
 
 
=== gstreamer flip video ===
 
 
 
This is handy if the camera is mounted upside-down or sideways.
 
Upside-down:
 
<pre>
 
gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv,width=320,height=240,framerate=30/1 ! videoflip method=clockwise ! xvimagesink
 
</pre>
 
Sideways:
 
<pre>
 
gst-launch v4l2src device=/dev/video1 ! video/x-raw-yuv,width=320,height=240,framerate=30/1 ! videoflip method=clockwise ! xvimagesink
 
# or
 
gst-launch v4l2src device=/dev/video1 ! video/x-raw-yuv,width=320,height=240,framerate=30/1 ! videoflip method=counterclockwise ! xvimagesink
 
</pre>
 
 
 
=== gstreamer fbdevsink "ERROR: Pipeline doesn't want to pause." ===
 
 
 
If you are trying to use the framebuffer device for video playback then you may get an error like the one below. This is a permissions problem. Try adding '''sudo''' in front of the pipeline, or run the command as root.
 
 
 
<pre>
 
$ gst-launch videotestsrc ! ffmpegcolorspace ! fbdevsink
 
Setting pipeline to PAUSED ...
 
ERROR: Pipeline doesn't want to pause.
 
Setting pipeline to NULL ...
 
Freeing pipeline ...
 
</pre>
 
 
 
=== gstreamer xvimagesink "ERROR: ... Could not initialize Xv output" ===
 
 
 
This happens if your X11 installation does not support '''Xv'''. This is a common problem when working with a virtual machine. Try using '''ximagesink''' instead of '''xvimagesink'''.
 
 
 
=== playback video on framebuffer (/dev/fbdev0) ===
 
 
 
<pre>
 
sudo gst-launch uridecodebin uri=file:///home/noah/Videos/ct_scan_sample.flv ! ffmpegcolorspace ! fbdevsink
 
</pre>
 
 
 
You can also use '''mplayer''' to play video on a framebuffer device. Be sure to specify '''fbdev2''' if you want color.
 
<pre>
 
sudo mplayer -vo fbdev2 ct_scan_sample.flv
 
</pre>
 
  
 
== Capture video and modify settings at the same time ==
 
== Capture video and modify settings at the same time ==

Latest revision as of 22:44, 23 June 2014


V4L2 -- Video For Linux Version Two

UVC

For a list of cameras that support UVC see the official Linux UVC site. Full UVC support in Linux:

I have been using a Logitech HD Pro Webcam C910, USB Device ID: 046d:0821, for my tests.

Gstreamer

See gstreamer.

Capture video and modify settings at the same time

Start `guvcview` with the --control_only option to display a GUI dialog to edit camera settings. This will work while another video display or capture application is already running.

guvcview --control_only --device=/dev/video0

fswebcam

`fswebcam` is a small and simple tool for grabbing still images from a camera. The world needs more apps like this. It can grab a single image or grab sequences of images in a loop. It can save images to a file or pipe them to stdout.

fswebcam --png --save fswebcam-test.png


Common UVC patterns with `uvcdynctrl`

apt-get install uvcdynctrl
uvcdynctrl --device=/dev/video1 --clist
uvcdynctrl --device=/dev/video1 --get='Focus, Auto'
uvcdynctrl --device=/dev/video1 --set='Focus, Auto' 0
uvcdynctrl --device=/dev/video1 --set='Focus (absolute)' 20

See also