媒體傳輸庫 (MTL) 是一種基於軟體的解決方案,專為高吞吐量、低延遲傳輸和接收媒體資料而設計。它具有專為媒體傳輸而設計的高效用戶空間 LibOS UDP 堆棧,並配備了符合 SMPTE ST 2110 標準的內建實現,用於託管 IP 網路上的專業媒體。
媒體傳輸庫解決了使用軟體庫並透過 IP 網路傳輸 ST2110 相容媒體串流的嚴格時序挑戰。該庫沒有使用專用硬件,而是利用現有的常用 CPU 平台和傳統 NIC,這些平台包含速率限制,以滿足 SMPTE ST 2110 標準中嚴格的時序挑戰。
如果您發現我們的專案有價值,請考慮給它一顆星。您的支持有助於我們成長並影響開源社群中的更多人。每一顆星星都很重要,並且受到極大的讚賞。
支援的資料路徑後端:DPDK PMD、本機核心套接字和帶有 eBPF 過濾器的 AF_XDP。
使用者空間 LibOS UDP 堆疊具有 POSIX 套接字相容 API。
非root運行。
多進程處理,每個進程最多允許 8 個 NIC。
SR-IOV 的虛擬化支援。
具有硬體時間戳卸載功能的內建 PTP 協定。
FFMPEG 外掛程式、OBS(開放式廣播軟體)外掛程式和 Intel® Media SDK 支援。
除了本機 C/C++ API 之外,它還提供 Python 和 Rust 的綁定。
節奏分為窄節奏和寬節奏。請參閱有關我們軟體解決方案的 ST2110 窄版報告的合規性頁面。
ST2110-10、ST2110-20、ST2110-21、ST2110-30、ST2110-40、ST2022-7。
1080p、1080i、720p、4k、8k 等。
幀速率:120、119.88、100、60、59.94、50、30、29.97、25、24、23.98。
支援 ST2110-20 中列出的所有視訊格式,包括 YUV 4:2:2 10 位元等。
大端和小端之間的 SIMD 色彩空間轉換器。
ST2110-22 帶編碼器/解碼器插件介面。
ST2022-6 透過 RTP 直通介面。
ST2110-20 RX 時序合規性解析器,具備硬體 RX 時間戳記卸載功能。
媒體傳輸庫利用DPDK(資料平面開發套件)EAL(包括記憶體和核心管理的環境抽象層)來實現高效、即時、低延遲的媒體傳輸解決方案。這種基於軟體的媒體傳輸堆疊支援使用 COTS 硬體在邊緣和雲端環境中進行部署。
此函式庫包含虛擬資料路徑後端層,旨在抽象化各種 NIC 實作並向上層網路層提供統一的資料包 TX/RX 介面。目前支援三種類型的網卡設備:
DPDK 輪詢模式驅動程式 (PMD):這些驅動程式利用「輪詢模式」驅動程式完全繞過核心的網路堆疊。這種方法提供了直接的硬體訪問,消除了繁重的用戶/核心上下文切換,並避免了 IRQ(中斷請求)切換。因此,DPDK PMD 提供超低延遲和高吞吐量,使其成為要求苛刻的網路應用的理想選擇。
本機 Linux 核心網路套接字堆疊:此選項支援全範圍的核心生態系統。
具有 eBPF 過濾器的 AF_XDP:AF_XDP 代表了 Linux 網路堆疊的重大進步,在原始效能和與內核網路生態系統的整合之間取得了平衡。在性能至關重要但像 DPDK 這樣的完整內核旁路解決方案不可行或不理想的情況下,它特別有價值。
該庫引入了基於任務的非同步調度程序,可優化 CPU 資源利用率,促進與各種資料包處理單元和加速器的整合。
此外,資料包調步模組還支援各種調步演算法,包括部分硬體卸載的 RL(速率限制)和完全基於軟體的 TSC(時間戳計數器)。
MTL 還整合了用於大端和小端 CSC(色彩空間格式轉換)的 SIMD(單指令、多數據)、DMA(直接內存訪問)和插件接口,從而能夠創建全面的視頻製作生態系統。
詳細設計請參考設計指南。
由於與 DPDK PMD、核心套接字和 AF_XDP 後端相容,MTL 提供了多功能乙太網路支援。
對於 DPDK PMD 支持,您可以參考 DPDK PMD 網站 https://doc.dpdk.org/guides/nics/ 以取得支援的乙太網路硬體的完整清單。
如果 DPDK 不支援您的 NIC,MTL 會提供具有核心 (Linux) 套接字傳輸支援的後備選項。
但請注意,我們的日常開發和驗證主要在 Intel E810 系列和 AWS ENA 上進行,因此我們無法保證其他網路介面卡 (NIC) 的狀態。
需要注意的重要一點是,由於速率限制功能,僅 Intel E810 系列與 DPDK PMD 一起支援 TX 的窄步調。所有其他類型的使用都必須使用TSC(時間戳計數器)作為調步來源,這只能保證寬廣範圍的調步。
請參閱建置指南,以了解有關如何建置 DPDK、程式庫和範例應用程式的說明。
對於 Windows,請參閱 Win 建置指南以取得有關如何建置的說明。
有關如何設定和運行基於 DPDK PMD 後端的演示管道應用程式的說明,請參閱運行指南。
對於Windows,請參閱Windows運行指南。
此外,請參閱 VM 指南和 Windows VM 指南,以了解有關基於 VF 直通設定 Linux 和 Windows 來賓 VM 的說明。
對於AWS(雲端環境),請參閱AWS運作指南,以了解如何設定和執行示範。
若要使用內建核心 NIC 驅動程式在核心網路堆疊上執行此程式庫,請遵循核心套接字指南中提供的說明。
若要快速開發基於媒體傳輸庫的應用程序,請參考設計指南中的## 6. ST2110 API
。
MTL 支援 LD 預先載入 POSIX 相容的使用者空間 UDP 堆疊,該堆疊直接在目前進程上下文中運作。此增強功能消除了通常與其他使用者空間 UDP 堆疊中使用的用戶端服務架構相關的跨核心訊息成本,從而顯著提高了效能。 MTL 的堆疊允許 NIC 傳輸和接收功能直接從 sendto/recvfrom API 運行,消除了跨核心呼叫的需要,並保持與 UDP 消費者的資料親和性 (LLC),從而優化效能。
若要了解如何使用 LibOS UDP 堆疊,請參閱 udp 文件。
MHV'23:基於商用現成硬體的即時媒體傳輸堆疊。 https://dl.acm.org/doi/10.1145/3588444.3591002
白皮書:開源程式庫支援 IP 網路上的即時媒體。 https://www.intel.com/content/www/us/en/content-details/786203/open-source-library-enables-real-time-media-over-ip-networks.html
2022 DPDK 使用者空間高峰會:基於 DPDK 的即時低延遲媒體傳輸堆疊。 https://www.youtube.com/watch?v=fiiOvHezpBs
我們歡迎社群為媒體傳輸庫專案做出貢獻。如果您有任何想法或問題,請透過使用 GitHub 問題或開啟拉取請求與我們分享。
在開啟拉取請求之前,請按照以下步驟操作:
將此存儲庫分叉到您自己的空間。
為您的變更建立一個新分支。
進行更改並提交。
將您的變更推送到您的分叉儲存庫。
開啟對主儲存庫的拉取請求。
如果您不希望主分支自動同步到上游,請前往Actions
並停用Upstream Sync
工作流程。
我們使用 super-linter 操作進行樣式檢查。
對於C/C++編碼,可以執行以下命令快速修復樣式:
./格式編碼.sh
對於 Python,使用black
和isort
格式化程式。
須藤 pip 安裝黑色 sudo pip 安裝 isort 須藤 pip 安裝 pylint
黑蟒/ 對Python進行排序/ 找到 python/example/ -name "*.py" -exec pylint {} ;
對於其他語言,請檢查 Docker 容器內的以下範例命令:
# super-linterdocker run -it --rm -v "$PWD":/opt/ --entrypoint /bin/bash github/super-lintercd /opt/# echo "shfmt check"find ./ -type f -name " *.sh" -exec shfmt -w {} +# echo "shell check"find ./ -name "*.sh" -exec shellcheck {} ;# hadolint checkhadolint docker/ubuntu.dockerfile# actionlint checkactionlint# markdownlint checkfind 。 / -name "*.md" -exec markdownlint {} -c .markdown-lint.yml ;# find ./ -name "*.md" -exec markdownlint {} --fix -c .markdown-lint.yml ;# textlintfind ./ -name "*.md" -exec textlint {} ;# find ./ -name "*.md" -exec textlint {} --fix ;