Media Transport Library (MTL) es una solución basada en software diseñada para la transmisión y recepción de datos multimedia de alto rendimiento y baja latencia. Cuenta con una eficiente pila LibOS UDP de espacio de usuario diseñada específicamente para el transporte de medios y viene equipada con una implementación integrada compatible con SMPTE ST 2110 para medios profesionales a través de redes IP administradas.
La biblioteca de transporte de medios resuelve los estrictos desafíos de sincronización del transporte de flujos de medios compatibles con ST2110 utilizando una biblioteca de software y a través de redes IP. En lugar de hardware especializado, esta biblioteca aprovecha las plataformas de CPU comúnmente disponibles con NIC convencionales que incorporan limitación de velocidad para cumplir con los estrictos desafíos de sincronización del estándar SMPTE ST 2110.
Si encuentra valor en nuestro proyecto, considere darle una estrella. Su apoyo nos ayuda a crecer y llegar a más personas en la comunidad de código abierto. Cada estrella cuenta y es muy apreciada.
Backend de ruta de datos admitido: DPDK PMD, socket de kernel nativo y AF_XDP con filtro eBPF.
La pila UDP de LibOS en el espacio de usuario presenta una API compatible con socket POSIX.
Ejecución no root.
Manejo multiproceso, permitiendo hasta 8 NIC por proceso.
Soporte de virtualización por SR-IOV.
Protocolo PTP integrado con descarga de marca de tiempo de hardware.
Complemento FFMPEG, complemento OBS (Open Broadcaster Software) y compatibilidad con Intel® Media SDK.
Además de la API nativa de C/C++, también ofrece enlaces para Python y Rust.
Ritmo estrecho y amplio. Consulte la página de cumplimiento para ver el informe limitado ST2110 sobre nuestra solución de software.
ST2110-10, ST2110-20, ST2110-21, ST2110-30, ST2110-40, ST2022-7.
1080p, 1080i, 720p, 4k, 8k y otros.
FPS: 120, 119,88, 100, 60, 59,94, 50, 30, 29,97, 25, 24, 23,98.
Se admiten todos los formatos de vídeo enumerados en ST2110-20, incluido YUV 4:2:2 de 10 bits y otros.
Convertidor de espacio de color SIMD entre big-endian y little-endian.
ST2110-22 con interfaz de complemento codificador/decodificador.
ST2022-6 mediante interfaz de paso RTP.
Analizador de cumplimiento de temporización ST2110-20 RX con descarga de marca de tiempo RX de hardware.
La biblioteca de transporte de medios aprovecha DPDK (kit de desarrollo de plano de datos) EAL (capa de abstracción del entorno que incluye la gestión de memoria y núcleo) para implementar una solución de transporte de medios altamente eficiente, en tiempo real y de baja latencia. Esta pila de transporte de medios basada en software permite la implementación en entornos de nube y de borde utilizando hardware COTS.
La biblioteca incorpora una capa de backend de ruta de datos virtual, diseñada para abstraer varias implementaciones de NIC y proporcionar una interfaz TX/RX de paquetes unificada a la capa de red superior. Actualmente admite tres tipos de dispositivos NIC:
Controladores en modo de encuesta (PMD) DPDK: estos controladores omiten por completo la pila de red del kernel y utilizan el controlador de 'modo de encuesta'. Este enfoque proporciona acceso directo al hardware, elimina los cambios intensos de contexto de usuario/núcleo y evita los cambios IRQ (solicitud de interrupción). Como resultado, los PMD DPDK ofrecen una latencia ultrabaja y un alto rendimiento, lo que los hace ideales para aplicaciones de red exigentes.
Pila de sockets de red del kernel nativo de Linux: esta opción admite toda la gama de ecosistemas del kernel.
AF_XDP con filtro eBPF: AF_XDP representa un avance significativo en la pila de redes de Linux, logrando un equilibrio entre el rendimiento bruto y la integración con el ecosistema de redes del kernel. Es particularmente valioso en escenarios donde el rendimiento es crítico, pero una solución completa de derivación del kernel como DPDK no es factible ni deseada.
La biblioteca presenta un programador asíncrono basado en tasklets que optimiza la utilización de recursos de la CPU, facilitando la integración con varias unidades de procesamiento de paquetes y aceleradores.
Además, el módulo de estimulación de paquetes ofrece soporte para varios algoritmos de estimulación, incluido RL (límite de velocidad), que se descarga parcialmente por hardware, y TSC (contador de marcas de tiempo), que está completamente basado en software.
MTL también incorpora SIMD (instrucción única, datos múltiples) para CSC (conversión de formato de espacio de color) de big-endian y little-endian, DMA (acceso directo a memoria) e interfaces de complementos, lo que permite la creación de un ecosistema integral de producción de video.
Para conocer el diseño detallado, consulte la guía de diseño.
MTL ofrece soporte Ethernet versátil, gracias a su compatibilidad con DPDK PMD, socket de kernel y backends AF_XDP.
Para obtener compatibilidad con DPDK PMD, puede consultar el sitio DPDK PMD https://doc.dpdk.org/guides/nics/ para obtener una lista completa del hardware Ethernet compatible.
En los casos en los que DPDK no admite su NIC, MTL proporciona una opción alternativa con soporte de transporte de sockets del kernel (Linux).
Sin embargo, tenga en cuenta que nuestro desarrollo y validación diarios se llevan a cabo principalmente en la serie Intel E810 y AWS ENA, por lo que no podemos garantizar el estado de otras tarjetas de interfaz de red (NIC).
Un punto importante a tener en cuenta es que el ritmo estrecho de TX solo es compatible con la serie Intel E810 junto con DPDK PMD debido a la función de límite de velocidad. Todos los demás tipos de uso deben utilizar TSC (Contador de marca de tiempo) como fuente de estimulación, lo que solo puede garantizar una estimulación amplia y amplia.
Consulte la guía de compilación para obtener instrucciones sobre cómo compilar DPDK, la biblioteca y la aplicación de muestra.
Para Windows, consulte la guía de compilación de Win para obtener instrucciones sobre cómo compilar.
Consulte la guía de ejecución para obtener instrucciones sobre cómo configurar y ejecutar la aplicación de canalización de demostración basada en el backend DPDK PMD.
Para Windows, consulte la guía de ejecución de Windows.
Además, consulte la guía de VM y la guía de VM de Windows para obtener instrucciones sobre cómo configurar máquinas virtuales invitadas de Linux y Windows basadas en el paso a través de VF.
Para AWS (entorno de nube), consulte la guía de ejecución de AWS para obtener instrucciones sobre cómo configurar y ejecutar la demostración.
Para ejecutar esta biblioteca en la pila de red del kernel con el controlador NIC del kernel integrado, siga las instrucciones proporcionadas en la guía del socket del kernel.
Para desarrollar rápidamente aplicaciones basadas en la biblioteca de transporte de medios, consulte ## 6. ST2110 API
de la guía de diseño.
MTL admite una pila UDP de espacio de usuario compatible con POSIX de precarga de LD que opera directamente dentro del contexto del proceso actual. Esta mejora aumenta significativamente el rendimiento al eliminar los costos de mensajes entre núcleos típicamente asociados con las arquitecturas de servicio de cliente utilizadas en otras pilas UDP del espacio de usuario. La pila de MTL permite que las funciones de transmisión y recepción de NIC se ejecuten directamente desde la API de envío/recepción, eliminando la necesidad de llamadas entre núcleos y manteniendo la afinidad de datos (LLC) con el consumidor UDP, optimizando así el rendimiento.
Para aprender a utilizar la pila UDP de LibOS, consulte el documento udp.
MHV'23: una pila de transporte de medios en tiempo real basada en hardware comercial disponible. https://dl.acm.org/doi/10.1145/3588444.3591002
Informe técnico: La biblioteca de código abierto permite medios en tiempo real a través de redes IP. https://www.intel.com/content/www/us/en/content-details/786203/open-source-library-enables-real-time-media-over-ip-networks.html
Cumbre del espacio de usuario DPDK 2022: pila de transporte de medios en tiempo real y de baja latencia basada en DPDK. https://www.youtube.com/watch?v=fiiOvHezpBs
Damos la bienvenida a las contribuciones de la comunidad al proyecto Biblioteca de transporte de medios. Si tiene alguna idea o problema, compártalo con nosotros utilizando los problemas de GitHub o abriendo una solicitud de extracción.
Antes de abrir una solicitud de extracción, siga estos pasos:
Bifurca este repositorio en tu propio espacio.
Cree una nueva rama para sus cambios.
Realice sus cambios y confírmelos.
Envía tus cambios a tu repositorio bifurcado.
Abra una solicitud de extracción al repositorio principal.
Si no desea que la rama principal se sincronice automáticamente con la rama ascendente, vaya a Actions
y deshabilite el flujo de trabajo Upstream Sync
.
Usamos la acción super-linter para comprobaciones de estilo.
Para la codificación C/C++, puede ejecutar el siguiente comando para corregir rápidamente el estilo:
./formato-codificación.sh
Para Python, se utiliza el formateador black
e isort
.
sudo pip instalar negro sudo pip instalar isort sudo pip instalar pylint
pitón negro/ ordenar Python/ buscar python/ejemplo/ -name "*.py" -exec pylint {} ;
Para otros idiomas, consulte el siguiente comando de ejemplo dentro del contenedor 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 {} ;# buscar ./ -name "*.md" -exec textlint {} --fix ;