标签: v4l2

ffmpeg 使用 YUYV 打开网络摄像头,但我想要 MJPEG

我需要 ffmpeg 在 MJPEG 模式下打开网络摄像头(罗技 C910),因为网络摄像头可以使用 MJPEG“协议”提供 ~24 fps,而使用 YUYV 只能提供 ~10 fps。我可以使用 ffmpeg 命令行在它们之间进行选择吗?

xx@(none) ~ $ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUV 4:2:2 (YUYV)

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : MJPEG
Run Code Online (Sandbox Code Playgroud)

我当前的命令行:

ffmpeg -y -f alsa -i hw:3,0 -f video4linux2 -r 20 -s 1280x720 -i /dev/video0 -acodec libfaac -ab 128k -vcodec libx264 /tmp/web.avi
Run Code Online (Sandbox Code Playgroud)

当我从网络摄像头录制时,ffmpeg 会产生损坏的 h264 流,但是当我从 x11grab 录制时会产生正常的 h264 …

webcam ffmpeg v4l2 mjpeg

19
推荐指数
1
解决办法
5万
查看次数

我可以通过 gphoto2 + v4l2loopback 将我的 DSLR 用作网络摄像头吗?

所以,我正在尝试做的事情可能有点复杂,因为我正在寻找自己的方式。

让我解释一下基础知识:

1 - 我有一台 DSLR 相机,我想将它用作网络摄像头(但 v4l2 无法使用它制作 /dev/videoX 设备,因此没有互联网应用程序可以使用它,只能使用特定应用程序,例如 Darktable)

2 - 我可以通过 gphoto2 从相机获取实时帧(但我不确定如何通过管道传输它们,以及我是否需要缩放和编码/解码它们)

3 - 我可以使用 v4l2loopback 创建一个假的网络摄像头设备(如 /dev/video1),我可以使用 gst-launch 将数据传输到它(但我不确定如何将帧传输到它)

我对它的了解:

1 - 我可以像这样将帧从相机发送到标准输出:

gphoto2 --capture-movie --stdout

2 - 我可以像这样将数据从视频测试源发送到假网络摄像头设备:

gst-launch-0.10 videotestsrc ! v4l2sink device=/dev/video1

3 - gphoto2 使用的格式是 mjpg(JPEG 格式)

那么,你能帮我解决这个问题吗?

我如何将帧从 gphoto2 传输到 gst-launch,并将其与 v4l2sink 一起使用以将它们发送到 /dev/video1(这样我就可以将其用作网络摄像头)?

谢谢!

linux webcam camera v4l2

11
推荐指数
2
解决办法
1万
查看次数

在 Linux 中使用网络摄像头和 VLC 进行高分辨率流传输时,图像质量差且 CPU 使用率高

我正在尝试使用网络摄像头进行一些流式传输,但到目前为止,结果并不好:我以 320x240 进行流式传输的所有内容看起来都不错,但一旦我选择更高分辨率,图像质量就会变得很糟糕,CPU 使用率也会下降穿过屋顶。

我使用的是 Logitech C525 摄像头,该摄像头声称是高清的,原始分辨率为 1280x720)。

如果1280x720是原生分辨率,我想知道为什么质量这么差?

我使用 VLC 进行流式传输,并使用以下 vlm 配置文件:

new camNumber2 broadcast enabled
setup camNumber2 input v4l2:///dev/video2:width:320:heigth:240
setup camNumber2 output #transcode{vcodec=mpeg4,acodec=none,vb=1000}:standard{access=http,mux=ogg,dst=0.0.0.0:8080}
control camNumber2 play
Run Code Online (Sandbox Code Playgroud)

就像我说的,一旦我把分辨率提高到更高,质量就会下降到一团糟。

我怀疑我的视频输入设置可能有问题,VLC 只是尝试将图像放大到我请求的分辨率,而不是按照请求的分辨率抓取图像。

linux vlc-media-player webcam streaming v4l2

6
推荐指数
1
解决办法
3794
查看次数

v4l2-loopback 设备的正确 ffmpeg 输出格式是什么?

按照这个问题中的指南,我做了:

$ sudo modprobe v4l2loopback
$ ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0
Run Code Online (Sandbox Code Playgroud)

设备/dev/video0按预期显示,但 ffmpeg 命令失败并显示以下输出:

$ ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0
ffmpeg version 4.0 Copyright (c) 2000-2018 the FFmpeg developers
...
[x11grab @ 0x559767794cc0] Stream #0: not enough frames to estimate rate; consider increasing probesize
....
[v4l2 @ 0x55976779e6c0] ioctl(VIDIOC_G_FMT): Invalid …
Run Code Online (Sandbox Code Playgroud)

linux ffmpeg arch-linux v4l2

5
推荐指数
1
解决办法
2万
查看次数

如何知道应该使用哪个帧率来使用 ffmpeg 捕获网络摄像头?

我使用以下命令从网络摄像头捕获视频:

ffmpeg -r 30 -f v4l2 -video_size 160x120 -i /dev/video0 output.avi
Run Code Online (Sandbox Code Playgroud)

-r 选项表示我想要的帧速率。然而,并不是我想要 30 FPS,只是否则它无法正常工作。

如果没有帧率,捕获就会非常有问题(我猜它试图捕获太多,但无法跟随)。

将帧速率设置为 15 时,输出视频比捕获持续时间长两倍(类似慢动作)。

帧率设置为30,似乎没问题。

我如何确定应该使用 30 fps?如果我想捕捉 15 fps,我应该怎样做才能正确播放?

有关我的网络摄像头的信息:

co@macbook2008:~$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
  Index       : 0
  Type        : Video Capture
  Pixel Format: 'YUYV'
  Name        : YUV 4:2:2 (YUYV)
    Size: Discrete 160x120
      Interval: Discrete 0.033s (30.000 fps)
      Interval: Discrete 0.036s (27.500 fps)
      Interval: Discrete 0.040s (25.000 fps)
      Interval: Discrete 0.044s (22.500 fps)
      Interval: Discrete 0.050s (20.000 fps)
      Interval: Discrete 0.057s (17.500 fps)
      Interval: …
Run Code Online (Sandbox Code Playgroud)

ffmpeg v4l2

5
推荐指数
0
解决办法
1万
查看次数

使用 V4L2 构建 FFmpeg

我想使用 ffmpeg 访问我的网络摄像头。我试过:

ffmpeg -f v4l2 -i /dev/video0 output.mp4
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

Unknown input format: 'v4l2'
Run Code Online (Sandbox Code Playgroud)

类似地用video4linux2代替v4l2. 因此,我假设我的 ffmpeg 版本丢失了v4l2。我看到有一个配置选项--enable-libv4l2https://ffmpeg.org/ffmpeg-all.html#video4linux2_002c-v4l2)。我将其添加到我的配置中,但运行配置我得到:

ERROR: "libv4l2 not found using pkg-config"
Run Code Online (Sandbox Code Playgroud)

我如何将其添加到我的构建中?我正在遵循https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu上的指南,并进行一些修改以包含特定的解码器等。

据我所知,libv4l2 可能随 Ubuntu 软件包一起提供libv4l-dev。安装它:

sudo apt-get install libv4l-dev
Run Code Online (Sandbox Code Playgroud)

不过似乎并不影响我的问题。我可以看到/usr/lib/x86_64-linux-gnu/pkgconfig/libv4l2.pc,我猜这就是我需要的文件。也许我只需要在配置选项中将 ffmpeg / pkg-config 指向它?就像是:

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig" ./configure ...
Run Code Online (Sandbox Code Playgroud)

?(不起作用)。修改--extra-cflags或者--extra-ldflags指向include/libs?也无法让它发挥作用。链接的 FFmpeg 构建指南将所有包保留在我的主文件夹中的 ffmpeg_build 目录中。我应该以libv4l-dev某种方式安装在那里吗?

config.log 的尾部:

END /tmp/ffconf.5wdQhyZ1.c
gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -I/home/jon/ffmpeg_build/include …
Run Code Online (Sandbox Code Playgroud)

linux webcam ffmpeg ubuntu v4l2

5
推荐指数
1
解决办法
8435
查看次数

为什么两个程序不能同时访问我的网络摄像头?

我第一次启动cheese,我的网络摄像头打开。然后我跑去vlc获取输出,/dev/video0但它失败了:

[0x7f3ea40012e8] v4l2 demux error: cannot set input 0: Device or resource busy
[0x7f3ea40012e8] v4l2 demux error: cannot set input 0: Device or resource busy
[0x7f3ea4002168] v4l2 access error: cannot set input 0: Device or resource busy
[0x7f3ea4002168] v4l2 access error: cannot set input 0: Device or resource busy
[0x7f3eb4000b78] main input error: open of `v4l2:///dev/video0' failed
Run Code Online (Sandbox Code Playgroud)

无论我运行哪对视频程序(skype、cheese、vlc 等),结果总是相同的:当第一个程序已经获取输出时,第二个程序无法再使用网络摄像头。

但是我觉得很好奇,因为video4linux 说

一般情况下,V4L2 设备可以打开多次。当驱动程序支持此功能时,用户可以例如启动“面板”应用程序来更改亮度或音量等控件,而另一个应用程序则捕获视频和音频。

我的网络摄像头显示lspci058f:a014 Alcor Micro Corp. Asus Integrated …

video linux webcam v4l2

4
推荐指数
1
解决办法
2003
查看次数

Linux (v4l) 网络摄像头 - 使设置“坚持”

我的 Logitech 摄像头 (C300) 已被正确检测并显示在 /dev/video0。但是,默认情况下,图像的对比度和饱和度设置为最大值,这会显着降低图像质量。我可以使用 guvcview 更改设置,但退出后设置恢复正​​常(我使用 mplayer 捕获帧)。如何使我在 guvcview 中所做的更改永久化?

编辑:

看起来 guvcview 的设置确实是“粘性的”——如果我再次打开它,图像保持不变。所以这是其他程序对网络摄像头的初始化所做的事情(mplayer 和 vlc 上的问题相同)

linux webcam debian v4l2 raspberry-pi

4
推荐指数
1
解决办法
7476
查看次数