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