如何解决为什么我不能在 Linux 上将 MJPEG 流从网络摄像头复制到 V4L2 环回设备?
我正在尝试将 USB 网络摄像头设备 V4L2 流 (/dev/video0) 以可能的最高分辨率和帧速率复制到 V4L2 环回设备 (/dev/video99),并使用运行在 RaspBerry Pi 4 上的硬件最新的 Raspbian(也是最低的 cpu 负载)。我使用的是 FFMPEG 版本 7:4.1.6-1~deb10u1+rpt2 和 v4l2loopback 版本 0.12.5.1。
输出:
ffmpeg -f v4l2 -list_formats all -i /dev/video0
给了我以下信息:
[video4linux2,v4l2 @ 0xc1e1c0] Compressed: mjpeg : Motion-JPEG : 1600x1200 3264x2448 2592x1944 2048x1536 1280x960 1024x768 800x600 640x480 320x240 1600x1200
[video4linux2,v4l2 @ 0xc1e1c0] Raw : yuyv422 : YUYV 4:2:2 : 1600x1200 3264x2448 2592x1944 2048x1536 1280x960 1024x768 800x600 640x480 320x240 1600x1200
3264x2448px 是原始 CCD 分辨率,图像用于机器视觉目的,所以我想以我所能达到的最高帧率使用这个最大分辨率。使用环回设备的原因是,我可以使用命令 ffmpeg -f v4l2 -video_size 3264x2448 -i /dev/video99 -frames 1 capture.png -y
查看/流式传输视频源(使用 GStreamer)并同时拍摄高分辨率的 PNG 快照,据我所知,这意味着有此分辨率的 MJPEG 流,并且根据命令 v4l2-ctl -d /dev/video0 --list-formats-ext
我可以管理 15fps:
ioctl: VIdioC_ENUM_FMT
Type: Video Capture
[0]: 'MJPG' (Motion-JPEG,compressed)
Size: discrete 1600x1200
Interval: discrete 0.067s (15.000 fps)
Interval: discrete 0.067s (15.000 fps)
Size: discrete 3264x2448
Interval: discrete 0.067s (15.000 fps)
Size: discrete 2592x1944
Interval: discrete 0.067s (15.000 fps)
Size: discrete 2048x1536
Interval: discrete 0.067s (15.000 fps)
Size: discrete 1280x960
Interval: discrete 0.067s (15.000 fps)
Size: discrete 1024x768
Interval: discrete 0.033s (30.000 fps)
Size: discrete 800x600
Interval: discrete 0.033s (30.000 fps)
Size: discrete 640x480
Interval: discrete 0.033s (30.000 fps)
Size: discrete 320x240
Interval: discrete 0.033s (30.000 fps)
Size: discrete 1600x1200
Interval: discrete 0.067s (15.000 fps)
Interval: discrete 0.067s (15.000 fps)
[1]: 'YUYV' (YUYV 4:2:2)
Size: discrete 1600x1200
Interval: discrete 0.100s (10.000 fps)
Interval: discrete 0.100s (10.000 fps)
Size: discrete 3264x2448
Interval: discrete 0.500s (2.000 fps)
Size: discrete 2592x1944
Interval: discrete 0.333s (3.000 fps)
Size: discrete 2048x1536
Interval: discrete 0.333s (3.000 fps)
Size: discrete 1280x960
Interval: discrete 0.100s (10.000 fps)
Size: discrete 1024x768
Interval: discrete 0.100s (10.000 fps)
Size: discrete 800x600
Interval: discrete 0.033s (30.000 fps)
Size: discrete 640x480
Interval: discrete 0.033s (30.000 fps)
Size: discrete 320x240
Interval: discrete 0.033s (30.000 fps)
Size: discrete 1600x1200
Interval: discrete 0.100s (10.000 fps)
Interval: discrete 0.100s (10.000 fps)
我觉得我已经尝试了所有可能的 GStreamer/FFMPEG 命令版本来实现这一点,并取得了不同程度的成功,但我经常遇到“av_interleaved_write_frame():无法分配内存”或一些转换问题M-JPEG 到用于回送设备的原始视频...
我应该使用什么命令?我快没救了!
我试过了:
gst-launch-1.0 v4l2src device=/dev/video0 ! "image/jpeg,width=3264,height=2448,framerate=15/1" ! avdec_mjpeg ! "video/x-raw,format=YUY2,framerate=15/1" ! v4l2sink device=/dev/video99
和
ffmpeg -f v4l2 -video_size 3264x2448 -i /dev/video0 -vcodec rawvideo -pix_fmt yuyv422 -r 1 -f v4l2 /dev/video99
(编辑)给出:
ffmpeg version 4.1.6-1~deb10u1+rpt2 copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (Raspbian 8.3.0-6+rpi1)
configuration: --prefix=/usr --extra-version='1~deb10u1+rpt2' --toolchain=hardened --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-omx-rpi --enable-mmal --enable-neon --enable-rpi --enable-vout-drm --enable-v4l2-request --enable-libudev --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --libdir=/usr/lib/arm-linux-gnueabihf --cpu=arm1176jzf-s --arch=arm
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Input #0,video4linux2,v4l2,from '/dev/video0':
Duration: N/A,start: 14226.770484,bitrate: 255688 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559),yuyv422,3264x2448,255688 kb/s,2 fps,2 tbr,1000k tbn,1000k tbc
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> rawvideo (native))
Press [q] to stop,[?] for help
Output #0,to '/dev/video99':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559),q=2-31,127844 kb/s,1 fps,1 tbn,1 tbc
Metadata:
encoder : Lavc58.35.100 rawvideo
av_interleaved_write_frame(): Cannot allocate memory
frame= 1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:01.00 bitrate=N/A speed=15.8x
video:15606kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unkNown
Conversion Failed!
和
ffmpeg -f v4l2 -video_size 3264x2448 -i /dev/video0 -vcodec rawvideo -pix_fmt yuv420p -r 15 -f v4l2 /dev/video99
(编辑)给出:
ffmpeg version 4.1.6-1~deb10u1+rpt2 copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (Raspbian 8.3.0-6+rpi1)
configuration: --prefix=/usr --extra-version='1~deb10u1+rpt2' --toolchain=hardened --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-omx-rpi --enable-mmal --enable-neon --enable-rpi --enable-vout-drm --enable-v4l2-request --enable-libudev --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --libdir=/usr/lib/arm-linux-gnueabihf --cpu=arm1176jzf-s --arch=arm
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Input #0,start: 13704.103283,to '/dev/video99':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Video: rawvideo (I420 / 0x30323449),yuv420p,1438248 kb/s,15 fps,15 tbn,15 tbc
Metadata:
encoder : Lavc58.35.100 rawvideo
av_interleaved_write_frame(): Cannot allocate memory
Last message repeated 7 times
frame= 8 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.53 bitrate=N/A dup=7 drop=0 speed=1.37x
video:93636kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unkNown
Conversion Failed!
和
ffmpeg -f v4l2 -input_format mjpeg -i /dev/video0 -vcodec copy -f v4l2 /dev/video99
(编辑)给出:
ffmpeg version 4.1.6-1~deb10u1+rpt2 copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (Raspbian 8.3.0-6+rpi1)
configuration: --prefix=/usr --extra-version='1~deb10u1+rpt2' --toolchain=hardened --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-omx-rpi --enable-mmal --enable-neon --enable-rpi --enable-vout-drm --enable-v4l2-request --enable-libudev --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --libdir=/usr/lib/arm-linux-gnueabihf --cpu=arm1176jzf-s --arch=arm
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
[mjpeg @ 0xdb5240] EOI missing,emulating
Input #0,start: 12511.425271,bitrate: N/A
Stream #0:0: Video: mjpeg,yuvj422p(pc,bt470bg/unkNown/unkNown),15 tbr,1000k tbc
[video4linux2,v4l2 @ 0xdb7f10] V4L2 output device supports only a single raw video stream
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Last message repeated 1 times
我不确定接下来要解决什么问题 - 查看可用内存,没有问题,那么我做错了什么?这个提要副本是拼图的最后一块......
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。