问题标签 [v4l2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2650 浏览

c - 如何从单个文件描述符中分配多个 MMAP?

因此,对于我最后一年的项目,我使用 Video4Linux2 从相机中提取 YUV420 图像,将它们解析为 x264(本机使用这些图像),然后通过 Live555 将编码流发送到兼容 RTP/RTCP 的视频播放器通过无线网络在客户端上。所有这些我都试图实时完成,所以会有一个控制算法,但这不是这个问题的范围。所有这些——除了 Live555——都是用 C 语言编写的。目前,我的视频编码接近尾声,但想要提高性能。

至少可以说,我遇到了一个障碍……我试图避免 V4L2 的用户空间指针并使用 mmap()。我正在编码视频,但由于它是 YUV420,我一直在分配新内存以将 Y'、U 和 V 平面保存在三个不同的变量中,以供 x264 读取。我想将这些变量保留为指向 mmap'ed 内存的指针。

但是,V4L2 设备有一个用于缓冲流的文件描述符,我需要将流拆分为三个符合 YUV420 标准的 mmap 变量,就像这样......

其中“宽度”和“高度”是视频的分辨率(例如 640x480)。

据我了解... MMAP 寻找一个文件,有点像这样(伪代码):

我的代码位于此处的 Launchpad 存储库中(更多背景信息): http ://bazaar.launchpad.net/~alex-stevens/+junk/spyPanda/files (修订版 11)

从这个 Wiki 插图中可以清楚地看到 YUV420 格式:http://en.wikipedia.org/wiki/File: Yuv420.svg(我基本上想将 Y、U 和 V 字节分成每个 mmap 的记忆)

任何人都愿意解释一种将三个变量从一个文件描述符映射到内存的方法,或者为什么我出错了?或者甚至暗示将 YUV420 缓冲区解析为 x264 的更好主意?:P

干杯! ^^

0 投票
3 回答
25405 浏览

audio - 如何从 linux USB 捕获设备与 ffmpeg 同时捕获音频和视频

我正在通过 USB Terratec Grabster AV350(基于 em2860 芯片)捕获视频。

播放时我没有成功获取音频。如果我用 vlc 或 ffplay 播放捕获的视频,我只会听到 3 秒的声音,然后视频的其余部分会保持沉默......

在捕获期间,我没有收到任何错误。最后它指示捕获的视频和音频的大小......

我为此使用 ffmpeg 命令:

ffmpeg -f alsa -ac 2 -i hw:3 -f video4linux2 -i /dev/video0 -acodec ac3 -ab 128k -vcodec mpeg4 -b 6000k -r 25 test5.avi

日志是:

如果我减少仅捕获音频的命令,则可以成功播放音频文件:

ffmpeg -f alsa -ac 2 -i hw:3,0 -acodec ac3 -ab 128k test5.avi

如果我只为视频捕获运行命令,则 vlc 或 ffplay 可以成功播放视频:

ffmpeg -f video4linux2 -i /dev/video0 -vcodec mpeg4 -b 12000k -r 25 test5.avi

我注意到的奇怪行为是,当我尝试捕获视频和音频时,之后我无法再捕获音频,除非我先拔下 AV350。

G350 位于卡 3:

该操作系统是具有 Ubuntu Natty Narwhal 版本的 Linux 2.6.38-8-generic

关于如何解决这个问题的任何帮助都会很棒....

谢谢 !

0 投票
2 回答
14207 浏览

stream - 使用 RTSP 流式传输网络摄像头

我正在尝试使用连接到我的笔记本电脑的网络摄像头进行视频直播。我在 Linux Ubuntu 中工作。

以下是服务器端和客户端的 Gstreamer 管道:

流媒体服务器:我正在尝试使用 gst-rtsp-server 从 v4l2 设备提供视频。

./test-launch --gst-debug=0 "( v4l2src !video/x-raw-yuv,width=352,height=288,framerate=15/1 !x264enc !rtph264pay name=pay0 pt=96 )"

接收者:

gst-launch -v rtspsrc location=rtsp://192.168.XX.XX:8554/test !解码器!自动视频接收器

我有这个消息错误:

将管道设置为暂停 ...<br> 错误:管道不想暂停。
错误:来自元素 /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:无法从资源中读取。附加调试信息:gstrtspsrc.c(4573):gst_rtspsrc_send ():/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:得到错误响应:503(服务不可用)。
将管道设置为 NULL …<br> 释放管道 …</p>

谁知道这个问题和/或可以尝试帮助我?

0 投票
3 回答
3106 浏览

linux - 一个 USB 2.0 集线器上的两个网络摄像头 - 适用于 windows 但不适用于 linux

下面的 openCV 代码从两个摄像头同时获取图像。它在 Windows 中运行良好,摄像头都连接到一个 USB 2.0 集线器。当我在 linux 中尝试相同的代码时,它一次只有一个摄像头的足够带宽。我也试过用 guvcview 一次查看两个流,同样的问题。我需要的是某种强制网络摄像头协同工作的方法,可能是通过设置驱动程序请求的带宽量。

0 投票
1 回答
1586 浏览

video-capture - V4L2 视频捕获驱动程序如何知道流的来源

我需要编写一个接收 24 位 RGB 输入的驱动程序并将其放在显示器上(通过 3rd 方应用程序作为 mplayer,或者将其转储到成名缓冲区,目前并不重要)

设置是 OMAP3 平台上的 2.3.39 内核,并连接了一个视频捕获芯片。

我知道哪些 GPIO 从视频捕获芯片(包括 clk、hsync 和 vsync)接收数据。

我试图查看几个驱动程序以了解它们如何定义以将 CPU GPIO 输入流式传输到设备,但找不到关于它如何连接的任何线索。我目前有一台相机在使用 omap3isp 处理那些精确的 GPIO。我正在尝试用其他视频输入替换它。

可以请一些人对此事有所了解,任何帮助将不胜感激。

最好的,乔纳森。

0 投票
1 回答
504 浏览

android - 如何在android中访问相机和麦克风?

我想写一个android程序,现在我在android的ui中使用jni通过openmax访问编解码器,我发现openmax组件中没有视频音频源或帧缓冲区。我的手机是高通的msm7227平台。在高通的网站上,它说 SOC 中有一个 amr 编解码器。

我可以使用 V4L2 访问相机并直接访问 /dev/XX 等音频设备来捕获音频数据吗?

例如,我想捕获一张图片并对其进行编码,首先我分配一个缓冲区,通过 V4L2 用数据填充缓冲区,然后将地址和其他参数传递给 openmax 视频编码器组件。我不知道这是一个好方法。

有人有经验可以帮助我吗?

顺便说一句,java 很慢,我想用 C 或 C++ 编写代码。

0 投票
3 回答
4217 浏览

python - Python/FFMPEG 命令行问题

我在 Python 脚本中运行 FFMPEG 命令时遇到问题。当我从终端运行以下命令时,我可以从连接的网络摄像头 (Logitech C310) 流式传输视频和音频,并输出到文件“out.avi”而不会出现任何错误。

当我在下面的 Python 脚本中运行相同的命令时,

它给了我错误:

任何人都可以阐明这里可能发生的事情吗?我试过使用 os.system() 和 subprocess.call() ,它给了我同样的错误。我不确定从哪里开始解决这里可能出现的问题。我尝试搜索“video4linux2 找不到 codec_id 0,pix_fmt -1 的正确格式”错误,但找不到任何一致的内容。

我还尝试将“ffmpeg -f ...”命令放在shell脚本“test.sh”中,并赋予它可执行权限。然后我打开终端,运行“./test.sh”,它就可以工作了。当我尝试从我的 Python 脚本中调用命令“./test.sh”时,我会像以前一样留下原始错误。这是我使用 test.sh 脚本尝试的 Python 命令:

0 投票
2 回答
3635 浏览

c - mmap 物理连续内存

我可能在这里有一些误解,所以请多多包涵。

我写了一个程序,从相机捕捉图像。mmap正如我在V4L2 文档中找到的那样,我正在共享相机和我的应用程序之间的内存。这很好用。现在我的处理器(它是 TI 的 DM3730)也有一个 DSP。我想使用 DSP,但它需要物理连续内存。TI 提供驱动程序来分配内存。我的问题是,现在我浪费了很多时间来将映射的内存复制到物理连续内存中。有没有办法告诉 mmap 它不应该自己分配内存,而是告诉 mmap 使用我分配的内存。

为了让您了解我在做什么(当然缺少很多代码,但我非常接近 V4L2 文档。我希望这足以理解我的问题):

之后,只要一帧准备好,我就会将内存从非连续内存复制到连续内存中。

如何立即将帧放入物理连续内存?

0 投票
1 回答
13010 浏览

embedded-linux - v4l2 视频捕获示例

这是我在这里的第一篇文章,我希望我能找到一些帮助

我正在三星 ok6410 板和 ov9650 cmos 相机上开发嵌入式 linux

我必须捕获视频并将其保存在 SD 卡上

我想使用捕获视频的循环缓冲区,当它已满时,允许新数据覆盖旧数据。

有一个标志,当升起时,捕获会持续 10 秒然后停止。保存到 SD 卡的视频应包含升旗前 10 秒和升旗后 10 秒。

我在这里阅读了 v4l2 API 规范官方网站上的捕获示例

http://free-electrons.com/kerneldoc/latest/video4linux/API.html

但是有些地方我看不懂或者不知道我是否理解正确

  1. 在这个例子中,有 4 个帧缓冲区,每个缓冲区可以容纳一帧。这是正确的吗?

  2. 有一个变量(frame_count)被初始化为70,这​​是否意味着通过完成这个程序我将有一个包含70帧的视频?

  3. fns(主循环)和(读取帧)做什么?我知道他们应该做什么,但无法理解书面代码、循环等

  4. 如何在此代码中调整 fps?或者我应该在相机寄存器中写入值?

  5. 捕获视频后,我将有一个充满原始数据的缓冲区,我想对其进行压缩或使用编解码器将其保存为 MPEG ,我可以更改要压缩的像素格式(例如 MPEG)而不是 YUYV 吗?或者我应该怎么做才能压缩视频?编解码器还是什么?

  6. 我可以将缓冲区中的这些原始数据写入文件 .yuv 吗?我找到了一些可以播放这种格式视频的软件。

  7. 是否可以使用循环缓冲区而不是线性缓冲区来保存捕获的视频?

我知道我的帖子太长了,但我是新手,找不到任何可以帮助我编写代码的教程。

提前致谢

0 投票
1 回答
2043 浏览

c - 使用 V4L2 捕获网络摄像头流失败

我开始在 Ubuntu 10.4 上使用 V4L2 框架。

目前我正在使用网络摄像头进行一些测试。我正在按照文档开始,安装工作正常。我下载并编译了应用程序示例。问题是视频输出,我使用以下命令调用可执行文件:

给定这个输出:

在此处输入图像描述

终端输出:

我不知道如何解决这个问题。我相信问题出在 C 代码中,因为我可以将网络摄像头与 Webcam Chesse 应用程序一起使用。非常感谢任何帮助。非常感谢!