媒体传输库 (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 ;