What is a recommendable alternative for a program that captures images from a V4L2 UVC webcam that serves JPEG images (here: Creative Live!Cam Optia)?

April 14th, 2008 by matthias

Working alternative

The only working alternative is, for now, to use gstreamer (to show the stream) and a screenshot tool. You cannot use all video sinks, as some are not accessible to the screenshot tools.

Here, the following did show up a green area when the screen was captured:

  • autovideosink
  • dfbvideosink
  • glimagesink
  • xvimagesink

And the following did not work at all:

  • sdlvideosink
  • gconfvideosink

What can be captured by screenshot tools is “ximagesink”, as can be shown thus:

gst-launch videotestsrc ! queue ! ximagesink
# and in another terminal create a screenshot by saying "scrot"

This also works (the “ffmpegcolorspace” is important!):

gst-launch v4l2src ! jpegdec ! ffmpegcolorspace ! ximagesink
# and in another terminal create a screenshot by saying "scrot"

You may now write a script that gets a screenshot and uploads it to a server.

Many very good snippets for all these are here: http://wiki.laptop.org/go/GStreamer

There are many ways how to get a screenshot of a linux screen: http://tips.webdesign10.com/how-to-take-a-screenshot-on-ubuntu-linux

Perhaps working alternatives

fswebcam

It is possible to use fswebcam (http://www.firestorm.cx/fswebcam).

Take screenshots with gstreamer

You may use gstreamer to take the screenshots. A webcam that serves JPEG images just serves JPEG images one after the other. The following worked to view the first captured image from a file that contains JPEG after JPEG:

gst-launch v4l2src ! filesink location=file.jpg
kuickshow file.jpg

This is even a very promising path, as you can combine some JPGs to reduce the noise.

Use gstreamer to pipe to vlc

You may use gstreamer with a filesink and then pipe that to vlc. The following created basic screen output here:

gst-launch v4l2src ! jpegdec ! autovideosink

The following recorded and played an avi video:

gst-launch v4l2src ! avimux ! filesink location=video.avi
xine video.avi

(Perhaps you need instead something like this or similar, but VLC cannot play this, saying: “avi demuxer error: avi module discarded (invalid file)”:)

gst-launch v4l2src device=/dev/video0 ! avimux ! filesink location=video.avi

The following recorded and played an avi video, using forwarding to stdout:

gst-launch v4l2src ! avimux ! fdsink | cat > video.avi
xine video.avi

(This however makes xine not recognize the format.)

And now, piping to vlc media player is possible by:

gst-launch v4l2src ! avimux ! fdsink | vlc -

(But this is not possible yet.) (You may need the “ffmpegcolorspace” element, it’s important.) (See here for the documentation: http://wiki.videolan.org/Uncommon_uses.)

Something comparable should be possible with xine:

gst-launch v4l2src ! avimux ! fdsink | xine stdin://

(However, xine does not recognize the file format and there’s yet a way to find
how to tell it explicitly about that. See here for that:
http://dvd.sourceforge.net/xine-howto/en_GB/html/howto.html#toc10.17 )

Non-working alternatives

ffmpeg to capture and convert

It is also possible to use ffmpeg to capture and transcode the stream from a V4L2 device. The command would be something like:

ffmpeg -v 100 -f video4linux2 -s 320x240 -i /dev/video0 -f audio_device -i /dev/dsp2 -f m4v test.m4v

This however leads to an error:

[video4linux2 @ 0xb7f64610]Cannot find a proper format.

Which might mean that the camera uses a compressed format. See this mailinglist contribution.

See for that and a discussion of alternatives: http://lists.berlios.de/pipermail/linux-uvc-devel/2007-September/002164.html

You may then pipe the ouput to vlc.

transcode to capture and convert

It is possible to use transcode and and pipe it’s output to VLC (as seen here:
http://wiki.videolan.org/Uncommon_uses ) and stream it from there.

On the transcode side something like:

transcode -x v4l2,null -g 640x480 -i /dev/video0 -w 4000 -y ffmpeg -F mjpeg -o test.avi

This leads however to this error:

[import_v4l2.so]: no usable pixel format supported by card

As also documented here: http://lists.berlios.de/pipermail/linux-uvc-devel/2007-September/002164.html

gstreamer

gstreamer is no alternative as it was impossible to create a network stream from it.

uvc-streamer

It is possible to use UVC-Streamer ( naaa.de/uvc_streamer.htm ), which works for V4L2 devices; however there were compilation errors.

mjpeg-streamer

It is possible to use MJPEG-Streamer, which is the successor to UVC-Streamer; however, compile errors happened in both the 35 and 51 revisions.

uvccapture

It is possible to use uvccapture; however, this is rather a hack and has errors when compiling.

MPEG4IP

MPEG4IP might be a possibility, but their tarball is corrupt and their development stopped.

ucview

You may try ucview (an application based on the unicap framework). There are .debs available; however, I wasn’t able to get an image (though it supports MJPEG); it would be the most comfortable software for capturing selected frames.

luvcview

You may try luvcview.

Posted in Graphikbearbeitung, Sprache: Englisch, Videobearbeitung |

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.