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 允许您通过当前六个用于视频、音频、前端、解复用、CA 和 IP-over-DVB 网络 Unix 风格的字符设备控制这些硬件组件。 视频和音频设备控制 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