Difference between revisions of "video 4 linux 2 notes"
m (→Gstreamer) |
m |
||
Line 12: | Line 12: | ||
== Gstreamer == | == Gstreamer == | ||
− | Gstreamer is | + | Gstreamer is my favorite command-line tool for handling video. |
+ | |||
+ | This will display the camera view in a window: | ||
+ | <pre> | ||
+ | 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> | ||
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. | 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. | ||
Line 22: | Line 37: | ||
<pre> | <pre> | ||
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv,width=640,height=480,framerate=60/1' ! xvimagesink | 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 -v videotestsrc ! ffmpegcolorspace ! xvimagesink | ||
</pre> | </pre> | ||
Line 61: | Line 86: | ||
fswebcam --png --save fswebcam-test.png | fswebcam --png --save fswebcam-test.png | ||
</pre> | </pre> | ||
+ | |||
+ | |||
+ | |||
+ | === Common UVC patterns with `uvcdynctrl` === | ||
+ | |||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | |||
+ | = See also = | ||
+ | |||
+ | * [[Mplayer_notes#Webcam_preview_--_play_raw_video_stream_from_video_device]] | ||
+ | * [[Mplayer_notes#Record_video_directly_from_video_device]] |
Revision as of 20:14, 30 October 2011
Contents
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
Gstreamer is my favorite command-line tool for handling video.
This will display the camera view in a window:
gst-launch v4l2src ! ffmpegcolorspace ! xvimagesink
This will display the camera view in a window with a specified size (320x240):
gst-launch v4l2src ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! xvimagesink
Record video stream to a file using Motion JPEG encoding (MJPEG):
gst-launch --eos-on-shutdown v4l2src ! ffmpegcolorspace ! jpegenc ! avimux ! filesink location=video.avi
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.
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv,width=1920,height=1080' ! xvimagesink
This will capture at a higher framerate, but it will undersample the pixels so you will get an effective 320x240 resolution.
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv,width=640,height=480,framerate=60/1' ! xvimagesink
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.
gst-launch --eos-on-shutdown v4l2src ! ffmpegcolorspace ! tee name=my_videosink ! jpegenc ! avimux ! filesink location=video.avi my_videosink. ! queue ! xvimagesink
Video test pattern:
gst-launch -v videotestsrc ! ffmpegcolorspace ! xvimagesink
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.
$ gst-launch videotestsrc ! ffmpegcolorspace ! fbdevsink Setting pipeline to PAUSED ... ERROR: Pipeline doesn't want to pause. Setting pipeline to NULL ... Freeing pipeline ...
playback video on framebuffer (/dev/fbdev0)
sudo gst-launch uridecodebin uri=file:///home/noah/Videos/ct_scan_sample.flv ! ffmpegcolorspace ! fbdevsink
You can also use mplayer to play video on a framebuffer device. Be sure to specify fbdev2 if you want color.
sudo mplayer -vo fbdev2 ct_scan_sample.flv
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