1. 介绍

1.1. 你需要了解什么

本文档的读者需要具备数字视频广播(数字电视)领域的一些知识,并应熟悉 MPEG2 规范 ISO/IEC 13818 的第一部分(又称 ITU-T H.222),也就是说,您应该知道什么是节目/传输流(PS/TS),以及什么是分组基本流(PES)或 I 帧。

各种数字电视标准文档可供下载:

此外,还需要了解如何访问 Linux 设备以及如何使用 ioctl 调用。这还包括 C 或 C++ 编程知识。

1.2. 历史

1999 年末,我们在 Convergence 使用的第一个数字电视卡 API 是 Video4Linux API 的扩展,该 API 主要为帧采集卡开发。因此,它并不非常适合用于数字电视卡及其新功能,例如录制 MPEG 流以及同时过滤多个段和 PES 数据流。

2000 年初,诺基亚向 Convergence 提出了一项新的标准 Linux 数字电视 API 提案。作为对基于开放标准终端开发的承诺,诺基亚和 Convergence 将其提供给所有 Linux 开发者,并于 2000 年 9 月在 https://linuxtv.org 上发布。通过西门子/Hauppauge DVB PCI 卡的 Linux 驱动程序,Convergence 提供了 Linux 数字电视 API 的第一个实现。早期,Convergence 是 Linux 数字电视 API 的维护者。

现在,该 API 由 LinuxTV 社区维护(即您,本文档的读者)。Linux 数字电视 API 正在随着内核子系统核心的改进而不断地被审查和改进。

1.3. 概述

dvbstb.svg

数字电视卡/机顶盒的组件

数字电视卡或机顶盒 (STB) 通常由以下主要硬件组件组成:

前端:由调谐器和数字电视解调器组成

原始信号通过卫星天线、普通天线或直接通过电缆到达数字电视硬件。前端将此信号下变频并解调为 MPEG 传输流 (TS)。对于卫星前端,这包括一个卫星设备控制 (SEC) 功能,允许控制 LNB 极化、多馈线开关或碟形天线转子。

条件接收 (CA) 硬件,如 CI 适配器和智能卡插槽

完整的 TS 流通过 CA 硬件。用户有权访问的节目(由智能卡控制)会实时解码并重新插入 TS 流中。

注意

并非所有数字电视硬件都提供条件接收硬件。

解复用器,用于过滤传入的数字电视 MPEG-TS 流

解复用器将 TS 流拆分为其组成部分,例如音频和视频流。除了通常的几个音频和视频流外,它还包含数据流,其中包含有关此流或同一提供商的其他流中提供的节目的信息。

音频和视频解码器

解复用器的主要目标是音频和视频解码器。解码后,它们将未压缩的音频和视频传递到计算机屏幕或电视机。

注意

现代硬件通常没有独立的解码器硬件,因为此类功能可以由主 CPU、系统图形适配器或嵌入在片上系统(SoC)集成电路上的信号处理硬件提供。

对于某些用途(例如,仅数据用途,如“卫星互联网”),它也可能不需要。

数字电视卡/机顶盒的组件 显示了这些组件之间的控制和数据流的粗略示意图。

1.4. Linux 数字电视设备

Linux 数字电视 API 允许您通过当前六个 Unix 风格的字符设备控制这些硬件组件,分别用于视频、音频、前端、解复用器、CA 和 DVB over IP 网络。视频和音频设备控制 MPEG2 解码器硬件,前端设备控制调谐器和数字电视解调器。解复用器设备让您控制硬件的 PES 和段过滤器。如果硬件不支持过滤,这些过滤器可以在软件中实现。最后,CA 设备控制硬件的所有条件接收功能。具体有多少 CA 功能通过此设备提供给应用程序,可能取决于平台的个体安全要求。

所有设备都可以在 /dev 目录下的 /dev/dvb 中找到。各个设备名称如下:

  • /dev/dvb/adapterN/audioM,

  • /dev/dvb/adapterN/videoM,

  • /dev/dvb/adapterN/frontendM,

  • /dev/dvb/adapterN/netM,

  • /dev/dvb/adapterN/demuxM,

  • /dev/dvb/adapterN/dvrM,

  • /dev/dvb/adapterN/caM,

其中 N 枚举系统中的数字电视卡,从 0 开始;M 枚举每个适配器中每种类型的设备,也从 0 开始。在后续讨论这些设备时,我们将省略 “/dev/dvb/adapterN/”。

所有设备的数据结构和函数调用的更多详细信息将在以下章节中描述。

1.5. API 包含文件

每个数字电视设备都有一个相应的包含文件。数字电视 API 包含文件应以部分路径的形式包含在应用程序源代码中,例如:

#include <linux/dvb/ca.h>

#include <linux/dvb/dmx.h>

#include <linux/dvb/frontend.h>

#include <linux/dvb/net.h>

为了使应用程序能够支持不同的 API 版本,还存在一个额外的包含文件 linux/dvb/version.h,它定义了常量 DVB_API_VERSION。本文档描述的是 DVB_API_VERSION 5.10