v4l2 可以用来从同一设备读取音频和视频吗?

Posted

技术标签:

【中文标题】v4l2 可以用来从同一设备读取音频和视频吗?【英文标题】:Can v4l2 be used to read audio and video from the same device? 【发布时间】:2009-05-27 17:37:35 【问题描述】:

我有一张采集卡,可以采集带有嵌入音频的 SDI 视频。我有一个 Linux 驱动程序的源代码,我正在尝试增强它以添加对 video4linux2 的支持。我的更改基于 vivi 示例。

我遇到的问题是,我能找到的所有示例都只处理视频或音频。即使在客户端,一切似乎都假设 v4l 只是视频,就像 ffmpeg 的 libavdevice。

我是否需要让我的驱动程序创建两个单独的设备,一个 v4l2 设备和一个 alsa 设备?这似乎使保持音频和视频同步的工作变得更加困难。

我希望在驱动程序和应用程序之间传递的每个缓冲区(通过 v4l2 的 mmap 接口)以某种方式包含一个帧,加上一些与该帧匹配(相对于时间)的音频。

或者可能让每个缓冲区包含一个标志,指示它是视频帧还是音频块。然后缓冲区上的时间戳可用于同步。

但我没有看到使用 V4L2 API 规范的方法,也没有看到任何支持 v4l2 的应用程序(gstreamer、ffmpeg、转码等)从单个设备读取音频和视频的示例。

【问题讨论】:

【参考方案1】:

通常,设备的音频捕获部分显示为单独的设备。它通常是一个不同的物理设备(可能共享一张卡),这是有道理的。我不确定这有多大帮助,但我熟悉的所有软件都是这样工作的……

【讨论】:

在这种情况下是否有可能同步视频和音频? 有没有可能知道哪个音频设备对应一个特定的视频设备? ioctl VIDIOC_S_AUDIO 到底是什么?如何从 VIDIOC_S_AUDIO 选择的音频输入中读取音频数据?【参考方案2】:

v4l2 缓冲区中有一些备用或保留字段,可用于通过指向映射缓冲区的指针将音频或其他数据从驱动程序传递到调用应用程序。

我修改了 BT8x8 驱动程序以使用这种方法从 A/D 卡传递数据,同步到 Ubuntu 6.06 上的视频。

它工作正常,但是维护我修改过的驱动程序的努力使我放弃了这种方法。

如果你还有兴趣,我可以挖掘细节。

如果您希望您的驱动程序使用 gstreamer 等播放,通常需要一个单独的音频设备。

大多数廉价的 v4l2 采集卡的音频只是一个模拟通道,带有音量控制,需要跳线才能通过声卡的线路输入采集音频。

【讨论】:

以上是关于v4l2 可以用来从同一设备读取音频和视频吗?的主要内容,如果未能解决你的问题,请参考以下文章

基于V4L2拍照

Ubuntu上Qt+Tcp网络编程+V4L2之视频监控

V4l2视频输出实现流程

ipad2018蓝牙音频传输格式

如何 开发 v4l2 tuener驱动

v4l2读取摄像头程序流程解析