1.5. 音频输入和输出

音频输入和输出是设备的物理连接器。视频采集设备有输入,输出设备有输出,每个设备零个或多个。无线电设备没有音频输入或输出。它们只有一个调谐器,实际上一个音频源,但是这个 API 只将调谐器与视频输入或输出关联起来,而无线电设备没有这些。 [1] 电视卡上用于将接收到的音频信号回环到声卡的连接器不被视为音频输出。

音频和视频输入和输出是关联的。选择视频源也会选择音频源。当视频和音频源是调谐器时,这一点最为明显。此外,音频连接器可以与多个视频输入或输出组合。假设存在两个复合视频输入和两个音频输入,则最多可能有四个有效的组合。视频和音频连接器的关系在各自的 struct v4l2_input 或 struct v4l2_outputaudioset 字段中定义,其中每个位代表一个音频输入或输出的索引号,从零开始。

要了解可用输入和输出的数量和属性,应用程序可以使用 ioctl VIDIOC_ENUMAUDIOVIDIOC_ENUMAUDOUT ioctl 分别进行枚举。 ioctl VIDIOC_ENUMAUDIO ioctl 返回的 struct v4l2_audio 还包含在查询当前音频输入时适用的信号状态信息。

VIDIOC_G_AUDIOVIDIOC_G_AUDOUT ioctl 分别报告当前的音频输入和输出。

注意

请注意,与 VIDIOC_G_INPUTVIDIOC_G_OUTPUT 不同,这些 ioctl 返回一个结构,如 ioctl VIDIOC_ENUMAUDIOVIDIOC_ENUMAUDOUT 所做的那样,而不仅仅是一个索引。

要选择音频输入并更改其属性,应用程序可以调用 VIDIOC_S_AUDIO ioctl。要选择音频输出(目前没有可更改的属性),应用程序可以调用 VIDIOC_S_AUDOUT ioctl。

当设备有多个可选择的音频输入时,驱动程序必须实现所有音频输入 ioctl,当设备有多个可选择的音频输出时,必须实现所有音频输出 ioctl。当设备有任何音频输入或输出时,驱动程序必须在 ioctl VIDIOC_QUERYCAP ioctl 返回的 struct v4l2_capability 中设置 V4L2_CAP_AUDIO 标志。

1.5.1. 示例:关于当前音频输入的信息

struct v4l2_audio audio;

memset(&audio, 0, sizeof(audio));

if (-1 == ioctl(fd, VIDIOC_G_AUDIO, &audio)) {
    perror("VIDIOC_G_AUDIO");
    exit(EXIT_FAILURE);
}

printf("Current input: %s\\n", audio.name);

1.5.2. 示例:切换到第一个音频输入

struct v4l2_audio audio;

memset(&audio, 0, sizeof(audio)); /* clear audio.mode, audio.reserved */

audio.index = 0;

if (-1 == ioctl(fd, VIDIOC_S_AUDIO, &audio)) {
    perror("VIDIOC_S_AUDIO");
    exit(EXIT_FAILURE);
}