Hi List, A while ago, I made the grave mistake of buying a Logitech C270 webcam [1], which initially seemed to be well-supported under Linux as a U.V.C.\ camera [2]. As shown by the following (partial) output of `v4l2-ctl --list-formats-ext` suggests, the full 720p@30fps is only supported when using MJPG.
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
[...]
Size: Discrete 1280x720
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
[...]
[1]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1280x720
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
[...]
Unfortunately, as per [3], Logitech C-series cameras (among others) utilise a
proprietary extension to the Motion-JPEG format, in which H.264 data is attached
to the various JPEG key and delta frames in the APP0 field [4], as shown when
inspecting the data of any frame ("AVI1" [5]):
$ ffmpeg -i video.mp4 -vcodec copy %02d.jpg
$ xxd 01.jpg | head -n 1
00000000: ffd8 ffe0 0021 4156 4931 0001 0101 0078 .....!AVI1.....x
^^^^^^^^^^^^^^^^^^^^^^
Thus, FFmpeg (and programs using FFmpeg) seem to have trouble trouble correctly
parsing these MJPG videos, and VLC almost crashes when trying to play one
(although the Firefox integrated mp4 player does fine):
$ vlc output.mp4
[00007f2eec008aa0] main video output error: video output creation failed
[00007f2ee8c0ae50] main decoder error: failed to create video output
$ ffmpeg -i output.mp4 somethingelse.avi
[mjpeg @ 0x5611aeee7000] unable to decode APP fields: Invalid data found
when processing input
Some work was done on libav many years ago, in an effort to provide a bitstream
filter to ffmpeg to properly convert these to JPEG/JFIF images, however I doubt
it's relevant any more [6], especially considering that Gentoo has removed
libav, and the corresponding USE-flag in `virtual/ffmpeg` is forever-masked [7].
To conclude, is there any method of making these Logitech'd MJPG files play
nicely with FFmpeg (and VLC) ? Someone on the aforementioned Stack Overflow
question pointed out that Skype is able to read both the outer MJPG and inner
H.264 streams, however I cannot confirm this myself. So far, Firefox is the only
program which can play these video files, and I do not want to use that as my
primary video-player !
I also need to provide these files to some non-technical (Windows) users at a
local College, so I want to make them as portable and standards-conformant as
possible.
Thanks for any guidance,
Ashley.
P.S. Other than this, it's an extremely good camera for someone on a budget.
[1] https://www.argos.co.uk/product/4034924
[2] https://linux-hardware.org/index.php?id=usb:046d-0825
[3] https://stackoverflow.com/a/56403628
[4]
https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format#JFIF_APP0_marker_segment
[5] https://exiftool.org/TagNames/JPEG.html#AVI1
[6]
https://code.videolan.org/libav/libav/commit/ba83c4bfb55d5c3fc6b3959edb0d3cda07a70241
[7] https://gitweb.gentoo.org/repo/gentoo.git/tree/profiles/base/use.mask#n15
--
Ashley Dixon
suugaku.co.uk
2A9A 4117
DA96 D18A
8A7B B0D2
A30E BF25
F290 A8AA
signature.asc
Description: PGP signature

