Die Media Transport Library (MTL) ist eine softwarebasierte Lösung, die für die Übertragung und den Empfang von Mediendaten mit hohem Durchsatz und geringer Latenz konzipiert ist. Es verfügt über einen effizienten User-Space-LibOS-UDP-Stack, der speziell für den Medientransport entwickelt wurde, und ist mit einer integrierten SMPTE ST 2110-kompatiblen Implementierung für professionelle Medien über verwaltete IP-Netzwerke ausgestattet.
Die Media Transport Library löst die strengen Timing-Herausforderungen beim Transport von ST2110-kompatiblen Medienströmen mithilfe einer Softwarebibliothek und über IP-Netzwerke. Anstelle spezieller Hardware nutzt diese Bibliothek vorhandene allgemein verfügbare CPU-Plattformen mit herkömmlichen NICs, die eine Ratenbegrenzung beinhalten, um den strengen Timing-Herausforderungen des SMPTE ST 2110-Standards gerecht zu werden.
Wenn Sie Wert auf unser Projekt legen, denken Sie bitte darüber nach, ihm einen Stern zu geben. Ihre Unterstützung hilft uns zu wachsen und mehr Menschen in der Open-Source-Community zu erreichen. Jeder Stern zählt und wird sehr geschätzt.
Unterstütztes Datenpfad-Backend: DPDK PMD, nativer Kernel-Socket und AF_XDP mit eBPF-Filter.
Der User-Space-LibOS-UDP-Stack verfügt über eine POSIX-Socket-kompatible API.
Nicht-Root-Ausführung.
Multiprozessverarbeitung, die bis zu 8 NICs pro Prozess ermöglicht.
Virtualisierungsunterstützung durch SR-IOV.
Integriertes PTP-Protokoll mit Hardware-Zeitstempel-Offload.
FFMPEG-Plugin, OBS-Plugin (Open Broadcaster Software) und Intel® Media SDK-Unterstützung.
Neben der nativen C/C++-API bietet es auch Bindungen für Python und Rust.
Schmales und breites Tempo. Auf der Compliance-Seite finden Sie den ST2110-Einzelbericht zu unserer Softwarelösung.
ST2110-10, ST2110-20, ST2110-21, ST2110-30, ST2110-40, ST2022-7.
1080p, 1080i, 720p, 4k, 8k und andere.
FPS: 120, 119,88, 100, 60, 59,94, 50, 30, 29,97, 25, 24, 23,98.
Alle in ST2110-20 aufgeführten Videoformate, einschließlich YUV 4:2:2 10-Bit und andere, werden unterstützt.
SIMD-Farbraumkonverter zwischen Big-Endian und Little-Endian.
ST2110-22 mit Encoder/Decoder-Plugin-Schnittstelle.
ST2022-6 per RTP-Passthrough-Schnittstelle.
ST2110-20 RX-Timing-Compliance-Parser mit Hardware-RX-Zeitstempel-Offload.
Die Media Transport Library nutzt DPDK (Data Plane Development Kit) und EAL (Environment Abstraction Layer einschließlich Speicher- und Kernverwaltung), um eine hocheffiziente Medientransportlösung in Echtzeit und mit geringer Latenz zu implementieren. Dieser softwarebasierte Medientransport-Stack ermöglicht die Bereitstellung in Edge- und Cloud-Umgebungen mithilfe von COTS-Hardware.
Die Bibliothek umfasst eine Backend-Schicht für virtuelle Datenpfade, die darauf ausgelegt ist, verschiedene NIC-Implementierungen zu abstrahieren und eine einheitliche Paket-TX/RX-Schnittstelle für die obere Netzwerkschicht bereitzustellen. Derzeit werden drei Arten von NIC-Geräten unterstützt:
DPDK-Poll-Mode-Treiber (PMDs): Diese Treiber umgehen den Netzwerk-Stack des Kernels vollständig und nutzen den „Poll-Mode“-Treiber. Dieser Ansatz bietet direkten Hardwarezugriff, eliminiert umfangreiche Benutzer-/Kernel-Kontextwechsel und vermeidet IRQ-Wechsel (Interrupt Request). Dadurch bieten DPDK-PMDs eine extrem niedrige Latenz und einen hohen Durchsatz, was sie ideal für anspruchsvolle Netzwerkanwendungen macht.
Nativer Linux-Kernel-Netzwerk-Socket-Stack: Diese Option unterstützt die gesamte Palette von Kernel-Ökosystemen.
AF_XDP mit eBPF-Filter: AF_XDP stellt einen bedeutenden Fortschritt im Linux-Netzwerk-Stack dar und schafft ein Gleichgewicht zwischen reiner Leistung und Integration in das Netzwerk-Ökosystem des Kernels. Dies ist besonders wertvoll in Szenarien, in denen die Leistung von entscheidender Bedeutung ist, eine vollständige Kernel-Bypass-Lösung wie DPDK jedoch nicht machbar oder erwünscht ist.
Die Bibliothek führt einen Tasklet-basierten asynchronen Scheduler ein, der die CPU-Ressourcennutzung optimiert und die Integration mit verschiedenen Paketverarbeitungseinheiten und Beschleunigern erleichtert.
Darüber hinaus bietet das Paket-Pacing-Modul Unterstützung für verschiedene Pacing-Algorithmen, darunter RL (Rate Limit), das teilweise hardwareunabhängig ist, und TSC (Timestamp Counter), das vollständig softwarebasiert ist.
MTL umfasst außerdem SIMD (Single Instruction, Multiple Data) für CSC (Color Space Format Conversion) des Big-Endian und Little-Endian, DMA (Direct Memory Access) und Plug-in-Schnittstellen und ermöglicht so die Schaffung eines umfassenden Videoproduktions-Ökosystems.
Einzelheiten zum Design finden Sie im Designleitfaden.
MTL bietet dank seiner Kompatibilität mit DPDK PMD, Kernel-Socket und AF_XDP-Backends vielseitige Ethernet-Unterstützung.
Informationen zur DPDK-PMD-Unterstützung finden Sie auf der DPDK-PMD-Website https://doc.dpdk.org/guides/nics/. Dort finden Sie eine umfassende Liste der unterstützten Ethernet-Hardware.
In Fällen, in denen Ihre Netzwerkkarte nicht von DPDK unterstützt wird, bietet MTL eine Fallback-Option mit Unterstützung für den Kernel-Socket-Transport (Linux).
Bitte beachten Sie jedoch, dass unsere tägliche Entwicklung und Validierung hauptsächlich auf der Intel E810-Serie und AWS ENA durchgeführt wird, sodass wir den Status für andere Netzwerkschnittstellenkarten (NICs) nicht garantieren können.
Ein wichtiger Punkt ist, dass die schmale TX-Stufe aufgrund der Ratenbegrenzungsfunktion nur für die Intel E810-Serie zusammen mit DPDK PMD unterstützt wird. Alle anderen Nutzungsarten müssen TSC (Timestamp Counter) als Taktquelle verwenden, was nur eine breite Taktung gewährleisten kann.
Anweisungen zum Erstellen von DPDK, der Bibliothek und der Beispielanwendung finden Sie im Build-Handbuch.
Anweisungen zum Erstellen für Windows finden Sie in der Win-Build-Anleitung.
Anweisungen zum Einrichten und Ausführen der Demo-Pipeline-Anwendung auf Basis des DPDK-PMD-Backends finden Sie im Ausführungsleitfaden.
Für Windows lesen Sie bitte die Windows-Ausführungsanleitung.
Anweisungen zum Einrichten von Linux- und Windows-Gast-VMs basierend auf VF-Passthrough finden Sie außerdem im VM-Leitfaden und im Windows-VM-Leitfaden.
Anweisungen zum Einrichten und Ausführen der Demo für AWS (Cloud-Umgebung) finden Sie im AWS-Ausführungsleitfaden.
Um diese Bibliothek auf dem Kernel-Netzwerkstapel mit dem integrierten Kernel-NIC-Treiber auszuführen, befolgen Sie bitte die Anweisungen im Kernel-Socket-Handbuch.
Informationen zur schnellen Entwicklung von Anwendungen auf Basis der Media Transport Library finden Sie unter ## 6. ST2110 API
aus dem Designleitfaden.
MTL unterstützt einen LD-Preload-POSIX-kompatiblen User-Space-UDP-Stack, der direkt im aktuellen Prozesskontext ausgeführt wird. Diese Verbesserung steigert die Leistung erheblich, indem sie die kernübergreifenden Nachrichtenkosten eliminiert, die normalerweise mit Client-Service-Architekturen verbunden sind, die in anderen UDP-Stacks im Benutzerbereich verwendet werden. Der MTL-Stack ermöglicht die direkte Ausführung der NIC-Übertragungs- und Empfangsfunktionen über die sendto/recvfrom-API, wodurch kernübergreifende Aufrufe überflüssig werden und die Datenaffinität (LLC) zum UDP-Konsumenten aufrechterhalten wird, wodurch die Leistung optimiert wird.
Informationen zur Verwendung des LibOS UDP-Stacks finden Sie im UDP-Dokument.
MHV'23: Ein Echtzeit-Medientransport-Stack basierend auf kommerzieller Standardhardware. https://dl.acm.org/doi/10.1145/3588444.3591002
Whitepaper: Open-Source-Bibliothek ermöglicht Echtzeit-Medien über IP-Netzwerke. https://www.intel.com/content/www/us/en/content-details/786203/open-source-library-enables-real-time-media-over-ip-networks.html
2022 DPDK Userspace Summit: Echtzeit-Medientransport-Stack mit geringer Latenz basierend auf DPDK. https://www.youtube.com/watch?v=fiiOvHezpBs
Wir freuen uns über Community-Beiträge zum Media Transport Library-Projekt. Wenn Sie Ideen oder Probleme haben, teilen Sie uns diese bitte über GitHub Issues mit oder öffnen Sie eine Pull-Anfrage.
Bevor Sie eine Pull-Anfrage öffnen, befolgen Sie bitte diese Schritte:
Verzweigen Sie dieses Repository in Ihren eigenen Bereich.
Erstellen Sie einen neuen Zweig für Ihre Änderungen.
Nehmen Sie Ihre Änderungen vor und übernehmen Sie sie.
Übertragen Sie Ihre Änderungen in Ihr geforktes Repository.
Öffnen Sie eine Pull-Anfrage an das Haupt-Repository.
Wenn Sie nicht möchten, dass der Hauptzweig automatisch mit dem Upstream synchronisiert wird, gehen Sie bitte zu Actions
und deaktivieren Sie den Upstream Sync
Synchronisierungsworkflow.
Zur Stilprüfung nutzen wir die Super-Linter-Aktion.
Für die C/C++-Codierung können Sie den folgenden Befehl ausführen, um den Stil schnell zu korrigieren:
./format-coding.sh
Für Python werden black
und isort
-Formatierer verwendet.
sudo pip install black sudo pip install isort sudo pip installiere Pylint
schwarze Python/ isort python/ find python/example/ -name "*.py" -exec pylint {} ;
Für andere Sprachen prüfen Sie bitte den folgenden Beispielbefehl im Docker-Container:
# 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 ;