我正在尝试使用v4l2_buffer的时间戳值(类型timeval)来将从UVC网络摄像头捕获的图像同步到外部事件.
但是时间戳与系统时间或运行时间等不同:
printf("image captured at %ld, %ld\n",
buffer->timestamp.tv_sec,
buffer->timestamp.tv_usec);
struct timeval tv;
gettimeofday(&tv, 0);
printf("current time %ld, %ld\n", tv.tv_sec, tv.tv_usec);
Run Code Online (Sandbox Code Playgroud)
结果是
image captured at 367746, 476270
current time 1335083395, 11225
Run Code Online (Sandbox Code Playgroud)
我的正常运行时间是10天.
我正在使用OpenCV编写Python程序,但我无法从v4l2摄像头捕获图像.
我尝试使用PS2 EyeToy和Droidcam(Android虚拟网络摄像头),它们都使用v4l2,但它们都不起作用:cv.CaptureFromCAM(0)只返回None.
我可以在其他程序中使用两个网络摄像头(尝试过VLC和Kamerka).
我想OpenCV只支持v4l,而不支持v4l2.
我怎么解决这个问题?是否存在v4l2-> v4l转换器?
编辑:我读过cv.CaptureFromFile使用ffmpeg来解码视频文件.是否可以手动指定格式,所以我可以使用ffmpeg的video4linux2demuxer?
我想在Ubuntu中编译一个v4l2示例,但是我收到以下错误:
guilherme@notedev01:~/Downloads/V4l2_samples-0.4.1$ make
gcc -O2 -L/usr/include -lX11 -lXext -o viewer viewer.c
/tmp/ccUjnjWQ.o: In function `image_destroy':
viewer.c:(.text+0x234): undefined reference to `XDestroyImage'
viewer.c:(.text+0x256): undefined reference to `XFreeGC'
viewer.c:(.text+0x277): undefined reference to `XShmDetach'
viewer.c:(.text+0x2ac): undefined reference to `XFreePixmap'
/tmp/ccUjnjWQ.o: In function `image_create':
viewer.c:(.text+0x305): undefined reference to `XCreateGC'
viewer.c:(.text+0x31d): undefined reference to `XGetWindowAttributes'
viewer.c:(.text+0x39e): undefined reference to `XShmCreateImage'
viewer.c:(.text+0x3f5): undefined reference to `XShmAttach'
viewer.c:(.text+0x44e): undefined reference to `XCreateImage'
viewer.c:(.text+0x494): undefined reference to `XShmQueryExtension'
viewer.c:(.text+0x4b4): undefined reference to `XShmPixmapFormat'
viewer.c:(.text+0x4dc): undefined reference to `XShmCreatePixmap'
/tmp/ccUjnjWQ.o: …Run Code Online (Sandbox Code Playgroud) 使用 v4l2loopback 设备我可以运行这两个虚拟设备:
a) 将佳能数码单反相机的预览图像通过 USB 通过 v4l2loopback 运行到 OBS 中:
modprobe v4l2loopback
gphoto2 --stdout --capture-movie | gst-launch-1.0 fdsrc fd=0 ! decodebin name=dec ! queue ! videoconvert ! tee ! v4l2sink device=/dev/video0
Run Code Online (Sandbox Code Playgroud)
找到here,它的工作原理。
b) 将 OBS 的输出流式传输到基于浏览器的会议系统中,如下所示:
modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1
Run Code Online (Sandbox Code Playgroud)
在这里找到,这也有效。
但是,我需要运行两个a)和b)在同一时间,预期这是行不通的。他们在干扰,似乎他们正在使用相同的缓冲区,视频在两个制作人之间来回翻转。
我学到的和尝试的:内核模块只能加载一次。可以使用命令卸载 v4l2loopback 模块modprobe -r v4l2loopback。我不知道第二次加载它是否会被忽略或卸载前一次。
我尝试将模块devices=2作为选项以及不同的视频设备加载,但我找不到正确的语法。
我正在尝试使用 V4L2 api 枚举网络摄像头设备支持的帧大小和帧速率。我尝试使用以下代码来完成此操作,但没有成功。ioctl 函数始终返回 -1。
#include <stdio.h>
#include <fcntl.h>
#include "linux/videodev2.h"
int main(int argc, char **argv) {
int fd = open("/dev/video0", O_RDWR);
struct v4l2_frmivalenum frmsize;
memset(&frmsize, 0, sizeof (struct v4l2_frmsizeenum));
ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS , &frmsize);
printf("%u \n", frmsize.he);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 如何才能检测连接的视频设备能够提供的最大分辨率?
我不想捕获任何东西,只需从v4l2中检索此信息.
谢谢!
我有一个名为Camera的类,它在构造函数中打开带有v4l2_open等的摄像头.析构函数执行一些清理并使用v4l2_close关闭文件描述符.
当相机崩溃时,我所做的是删除对象,然后创建一个新对象:
Camera *camera = new Camera();
(...)
if (crash) {
delete camera;
camera = new Camera();
}
Run Code Online (Sandbox Code Playgroud)
这是C++中new/delete的正确用法吗?
您好,我正在尝试使用 gstreamer 构建视频流管道,但我很难使其工作。我有一个支持 MJPG 的相机,所以我想将 jpeg 图像传递给jpegparse并使用rtpjpegpay转换为 rtp 。
./test-launch --gst-debug=3 '(v4l2src device=/dev/video0 ! image/jpeg,width=800,height=600 ! jpegparse ! rtpjpegpay name=pay0 pt=96)'
Run Code Online (Sandbox Code Playgroud)
对于接收端,我尝试了 VLC 播放器,但没有成功打开文件。我不知道为什么 - 这是否意味着上面的语法不正确?
有人可以帮忙吗?
我试过
examples$ ./test-launch --gst-debug=3 '(v4l2src device=/dev/video0 ! image/jpeg,width=800,height=600 ! jpegparse ! rtpjpegpay name=pay0 pt=96)'
stream ready at rtsp://127.0.0.1:8554/test
0:00:05.121994463 207540 0x56458325ef60 ERROR GST_PIPELINE grammar.y:453:gst_parse_element_set: could not set property "pt" in element "pay0" to "96)"
0:00:05.122054890 207540 0x56458325ef60 WARN default grammar.y:1137:priv_gst_parse_yyerror: Error during parsing: syntax error, unexpected $end
0:00:05.122069622 207540 0x56458325ef60 …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用 gst-launch 将视频流保存到文件中,同时观看视频本身(使用 v4l2src)。到目前为止,我通过使用 ! multifilesink 同时拥有一个 tcl 脚本,它会自动显示 X 窗口中一个文件夹中的最新文件。这有效,但当然有一点我想减少的延迟。
是否有可能仅使用 gst-launch 来做到这一点?不幸的是,我对 gstreamer 不是很有经验。是否可以在使用 multifilesrc 显示文件的同时使用 multifilesink 保存文件?或者只有 gst-launch 是不可能的?
我在互联网上找到了这个脚本,并尝试在 Google 上找到完整的参数列表,但没有成功:
# Record a video
v4l2-ctl --set-fmt-video=width=800,height=600,pixelformat=4
v4l2-ctl --stream-mmap=3 --stream-count=100 --stream-to=$1
exit
Run Code Online (Sandbox Code Playgroud)
你们知道如何旋转相机吗?
谢谢!
v4l2 ×11
c ×2
gstreamer ×2
linux ×2
opencv ×2
c++ ×1
ffmpeg ×1
gst-launch ×1
new-operator ×1
raspberry-pi ×1
raspbian ×1
resolution ×1
rtsp ×1
shell ×1
ubuntu ×1
v4l2loopback ×1
video4linux ×1