A Media Transport Library (MTL) é uma solução baseada em software projetada para transmissão e recepção de dados de mídia de alto rendimento e baixa latência. Ele apresenta uma pilha LibOS UDP de espaço de usuário eficiente, criada especificamente para transporte de mídia e vem equipado com uma implementação integrada compatível com SMPTE ST 2110 para mídia profissional em redes IP gerenciadas.
A Biblioteca de Transporte de Mídia resolve os rigorosos desafios de tempo de transporte de fluxos de mídia compatíveis com ST2110 usando uma biblioteca de software e através de redes IP. Em vez de hardware especializado, esta biblioteca aproveita plataformas de CPU existentes comumente disponíveis com NICs convencionais que incorporam limitação de taxa para atender aos rigorosos desafios de temporização do padrão SMPTE ST 2110.
Se você encontrar valor em nosso projeto, considere dar-lhe uma estrela. Seu apoio nos ajuda a crescer e alcançar mais pessoas na comunidade de código aberto. Cada estrela conta e é muito apreciada.
Backend de caminho de dados suportado: DPDK PMD, soquete de kernel nativo e AF_XDP com filtro eBPF.
A pilha LibOS UDP do espaço do usuário apresenta uma API compatível com soquete POSIX.
Execução não-root.
Manipulação de vários processos, permitindo até 8 NICs por processo.
Suporte de virtualização por SR-IOV.
Protocolo PTP integrado com descarregamento de carimbo de data/hora de hardware.
Plug-in FFMPEG, plug-in OBS (Open Broadcaster Software) e suporte Intel® Media SDK.
Além da API C/C++ nativa, também oferece ligações para Python e Rust.
Ritmo estreito e amplo. Consulte a página de conformidade para obter o relatório restrito do ST2110 sobre nossa solução de software.
ST2110-10, ST2110-20, ST2110-21, ST2110-30, ST2110-40, ST2022-7.
1080p, 1080i, 720p, 4k, 8k e outros.
FPS: 120, 119,88, 100, 60, 59,94, 50, 30, 29,97, 25, 24, 23,98.
Todos os formatos de vídeo listados em ST2110-20, incluindo YUV 4:2:2 de 10 bits e outros, são suportados.
Conversor de espaço de cores SIMD entre big-endian e little-endian.
ST2110-22 com interface de plug-in codificador/decodificador.
ST2022-6 por interface de passagem RTP.
ST2110-20 Analisador de conformidade de temporização RX com descarregamento de carimbo de data/hora RX de hardware.
A Biblioteca de Transporte de Mídia aproveita DPDK (Data Plane Development Kit) EAL (Environment Abstraction Layer incluindo memória e gerenciamento de núcleo) para implementar uma solução de transporte de mídia altamente eficiente, em tempo real e de baixa latência. Essa pilha de transporte de mídia baseada em software permite a implantação em ambientes de borda e de nuvem usando hardware COTS.
A biblioteca incorpora uma camada de back-end de caminho de dados virtual, projetada para abstrair várias implementações de NIC e fornecer uma interface TX/RX de pacote unificada para a camada de rede superior. Atualmente suporta três tipos de dispositivos NIC:
Drivers DPDK Poll-Mode (PMDs): Esses drivers ignoram totalmente a pilha de rede do kernel, utilizando o driver 'poll mode'. Essa abordagem fornece acesso direto ao hardware, elimina trocas pesadas de contexto de usuário/kernel e evita trocas de IRQ (Solicitação de Interrupção). Como resultado, os PMDs DPDK oferecem latência ultrabaixa e alto rendimento, tornando-os ideais para aplicações de rede exigentes.
Pilha de soquete de rede do kernel Linux nativo: esta opção oferece suporte a toda a gama de ecossistemas de kernel.
AF_XDP com filtro eBPF: AF_XDP representa um avanço significativo na pilha de rede Linux, alcançando um equilíbrio entre desempenho bruto e integração com o ecossistema de rede do kernel. É particularmente valioso em cenários onde o desempenho é crítico, mas uma solução de bypass completo do kernel como o DPDK não é viável ou desejada.
A biblioteca apresenta um agendador assíncrono baseado em tasklets que otimiza a utilização de recursos da CPU, facilitando a integração com várias unidades de processamento de pacotes e aceleradores.
Além disso, o módulo de estimulação de pacotes oferece suporte para vários algoritmos de estimulação, incluindo RL (Rate Limit), que é parcialmente descarregado por hardware, e TSC (Timestamp Counter), que é totalmente baseado em software.
MTL também incorpora SIMD (instrução única, dados múltiplos) para CSC (conversão de formato de espaço de cores) do big-endian e little-endian, DMA (acesso direto à memória) e interfaces de plug-in, permitindo a criação de um ecossistema abrangente de produção de vídeo.
Para o design detalhado, consulte o guia de design.
MTL oferece suporte Ethernet versátil, graças à sua compatibilidade com DPDK PMD, soquete de kernel e backends AF_XDP.
Para suporte ao DPDK PMD, você pode consultar o site do DPDK PMD https://doc.dpdk.org/guides/nics/ para obter uma lista abrangente de hardware Ethernet suportado.
Nos casos em que sua NIC não é suportada pelo DPDK, o MTL fornece uma opção de fallback com suporte para transporte de soquete do kernel (Linux).
No entanto, observe que nosso desenvolvimento e validação diários são realizados principalmente na série Intel E810 e AWS ENA, portanto, não podemos garantir o status de outras placas de interface de rede (NICs).
Um ponto importante a ser observado é que o ritmo estreito de TX só é suportado pela série Intel E810 junto com DPDK PMD devido ao recurso de limite de taxa. Todos os outros tipos de uso devem usar TSC (Timestamp Counter) como fonte de ritmo, o que só pode garantir um ritmo amplo.
Consulte o guia de construção para obter instruções sobre como construir o DPDK, a biblioteca e o aplicativo de exemplo.
Para Windows, consulte o guia de construção do Win para obter instruções sobre como construir.
Consulte o guia de execução para obter instruções sobre como configurar e executar o aplicativo de pipeline de demonstração com base no backend DPDK PMD.
Para Windows, consulte o guia de execução do Windows.
Além disso, consulte o guia de VM e o guia de VM do Windows para obter instruções sobre como configurar VMs convidadas do Linux e do Windows com base na passagem VF.
Para AWS (ambiente de nuvem), consulte o guia de execução da AWS para obter instruções sobre como configurar e executar a demonstração.
Para executar esta biblioteca na pilha de rede do kernel com o driver NIC do kernel integrado, siga as instruções fornecidas no guia de soquete do kernel.
Para desenvolver rapidamente aplicativos baseados na Biblioteca de Transporte de Mídia, consulte ## 6. ST2110 API
do guia de design.
MTL tem suporte para uma pilha UDP de espaço de usuário compatível com POSIX de pré-carregamento LD que opera diretamente dentro do contexto do processo atual. Esse aprimoramento aumenta significativamente o desempenho, eliminando os custos de mensagens entre núcleos normalmente associados às arquiteturas de serviço de cliente usadas em outras pilhas UDP de espaço de usuário. A pilha do MTL permite que as funções de transmissão e recepção da NIC sejam executadas diretamente da API sendto/recvfrom, eliminando a necessidade de chamadas entre núcleos e mantendo a afinidade de dados (LLC) com o consumidor UDP, otimizando assim o desempenho.
Para aprender como usar a pilha LibOS UDP, consulte o documento udp.
MHV'23: uma pilha de transporte de mídia em tempo real baseada em hardware comercial pronto para uso. https://dl.acm.org/doi/10.1145/3588444.3591002
Whitepaper: Biblioteca de código aberto permite mídia em tempo real em redes 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 Userspace Summit: Pilha de transporte de mídia em tempo real e de baixa latência baseada em DPDK. https://www.youtube.com/watch?v=fiiOvHezpBs
Agradecemos as contribuições da comunidade para o projeto Media Transport Library. Se você tiver alguma ideia ou problema, compartilhe-os conosco usando problemas do GitHub ou abrindo uma solicitação pull.
Antes de abrir uma solicitação pull, siga estas etapas:
Bifurque este repositório para seu próprio espaço.
Crie um novo branch para suas alterações.
Faça suas alterações e confirme-as.
Envie suas alterações para seu repositório bifurcado.
Abra uma solicitação pull para o repositório principal.
Se você não deseja que o branch principal seja sincronizado automaticamente com o upstream, vá para Actions
e desative o fluxo de trabalho Upstream Sync
.
Usamos a ação super-linter para verificações de estilo.
Para codificação C/C++, você pode executar o seguinte comando para corrigir rapidamente o estilo:
./format-coding.sh
Para Python, o formatador black
e isort
é usado.
sudo pip instalar preto sudo pip instalar isorção sudo pip instalar pylint
píton negra/ isortar python/ encontre python/exemplo/ -name "*.py" -exec pylint {} ;
Para outras linguagens, verifique com o seguinte comando de exemplo dentro do contêiner Docker:
# super-linterdocker execute -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 ;