1. 简介¶
1.1. 你需要知道什么¶
本文档的读者需要具备数字视频广播(数字电视)领域的一些知识,并且应该熟悉 MPEG2 规范 ISO/IEC 13818(又名 ITU-T H.222)的第一部分,即应该知道什么是节目/传输流 (PS/TS) 以及什么是包化基本流 (PES) 或 I 帧。
各种数字电视标准文档可在以下网站下载:
欧洲标准 (DVB): http://www.dvb.org 和/或 http://www.etsi.org。
美国标准 (ATSC): https://www.atsc.org/standards/
日本标准 (ISDB): http://www.dibeg.org/
还需要知道如何访问 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. 概述¶
数字电视卡或机顶盒 (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
。