标签: video4linux

跨平台网络摄像头访问

我正在寻找一个跨平台的视频捕获库,用于访问网络摄像头.一个包含Linux上的V4L/V4L2,Windows上的DirectShow和Mac上的QuickTime.

C或C++是首选,但如果有更好的库选项,我可以使用Java或Python.

directshow quicktime cross-platform video-capture video4linux

9
推荐指数
3
解决办法
5522
查看次数

GStreamer 时间戳 (PTS) 对于捕获的帧不是单调递增的

我编写了一些代码来使用 GStreamer 1.0 (PyGST) 从网络摄像头捕获帧。对我来说,知道确切的捕获时间很重要。为此,我设置了 v4l2src 属性 do-timestamp,并使用 appsink 将缓冲区 PTS 写入文本文件。

然而,时间戳并不是单调递增的。例如,帧16的时间戳是0.88199秒,帧17的时间戳是0.77462秒,即比前一帧早0.10737秒。(我有一张显示问题的图,但缺乏发布它所需的声誉。)

捕获的 GstBuffer 的 PTS 并不总是单调递增,这是否正确?如果这不是正常行为,有人知道我搞砸了什么吗?

我使用 Logitech c920 网络摄像头。这些帧在相机上采用 h.264 编码。代码大致如下:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst, Gtk
GObject.threads_init()
Gst.init(None)

class Webcam:
def __init__(self, video_dev='/dev/video0', fps=30):

    ts_log_fname = 'webcam_timestamps.log'
    vid_fname = 'webcam.mkv'
    self.ts_log = open(ts_log_fname, 'w')
    self.ts_log.write('video filename: %s\n '
                      '\nframe_number, cam_running_ts\n' % vid_fname)

    self.n_frames = 0

    # Create GStreamer pipline
    self.pipeline = Gst.Pipeline()

    # Create bus to get events from GStreamer pipeline
    self.bus …
Run Code Online (Sandbox Code Playgroud)

webcam timestamp capture gstreamer video4linux

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

为什么我可以将 h264 编码视频从网络摄像头流式传输到显示器和文件,但不能流式传输原始视频?

我想从 Logitech C920 网络摄像头流式传输原始视频,同时两者GStreamer 1.0 显示视频并将视频保存到文件。

如果我从相机流式传输 h264 编码的视频(相机提供硬件编码的 h264),则此方法有效,但如果我从相机流式传输原始视频,则此方法会失败。但是,如果我仅显示或仅保存到文件,则流式原始视频可以工作。

为什么它适用于 h264 视频流,但不适用于原始视频流?

h264 编码视频流从相机到显示和文件(有效):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-h264,width=640,height=480,framerate=15/1 ! tee name=t \
    t. ! queue ! h264parse ! avdec_h264 ! xvimagesink sync=false \
    t. ! queue ! h264parse ! matroskamux \
    ! filesink location='h264_dual.mkv' sync=false
Run Code Online (Sandbox Code Playgroud)

从相机到仅显示的原始视频流(有效):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! xvimagesink sync=false
Run Code Online (Sandbox Code Playgroud)

从相机到唯一文件的原始视频流(作品):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! videoconvert ! x264enc ! matroskamux \
    ! …
Run Code Online (Sandbox Code Playgroud)

webcam gstreamer video4linux

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

如何使用 video4linux api 获取网络摄像头设备支持的帧大小和帧间隔列表?

我正在尝试使用 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)

c video4linux v4l2

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