微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不能在 Linux 上将 MJPEG 流从网络摄像头复制到 V4L2 环回设备?

如何解决为什么我不能在 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 举报,一经查实,本站将立刻删除。