avconv / ffmpeg webcam capture while using minimum CPU processing

ssinfod picture ssinfod · Sep 10, 2015 · Viewed 7.4k times · Source

I have a question about avconv (or ffmpeg) usage.

My goal is to capture video from a webcam and saving it to a file. Also, I don't want to use too much CPU processing. (I don't want avconv to scale or re-encode the stream)

So, I was thinking to use the compressed mjpeg video stream from the webcam and directly saving it to a file.

My webcam is a Microsoft LifeCam HD 3000 and its capabilities are:

ffmpeg -f v4l2 -list_formats all -i /dev/video0

Raw: yuyv422 : YUV 4:2:2 (YUYV) : 640x480 1280x720 960x544 800x448 640x360 424x240 352x288 320x240 800x600 176x144 160x120 1280x800

Compressed: mjpeg : MJPEG : 640x480 1280x720 960x544 800x448 640x360 800x600 416x240 352x288 176x144 320x240 160x120

What would be the avconv command to save the Compressed stream directly without having avconv doing scaling or re-encoding.

For now, I am using this command:

avconv -f video4linux2 -r 30 -s 320x240 -i /dev/video0 test.avi

I'm not sure that this command is CPU efficient since I don't tell anywhere to use the mjpeg Compressed capability of the webcam.

Is avconv taking care of the configuration of the webcam setting before starting to record the file ? Is it always working of raw stream and doing scaling and enconding on the raw stream ?

Thanks for your answer

Answer

aergistal picture aergistal · Sep 10, 2015

Reading the actual documentation™ is the closest thing to magic you'll get in real life:

video4linux2, v4l2

input_format

Set the preferred pixel format (for raw video) or a codec name. This option allows one to select the input format, when several are available.

video_size

Set the video frame size. The argument must be a string in the form WIDTHxHEIGHT or a valid size abbreviation.

The command uses -c:v copy to just copy the received encoding without touching it therefore achieving the lowest resource use:

ffmpeg -f video4linux2 -input_format mjpeg -video_size 640x480 -i /dev/video0 -c:v copy <output>