Como obter fluxo legendado em RTMP de SDI

Havia uma tarefa de receber uma transmissão com legendas do sinal SDI e enviá-la para o CDN no formato de fluxo RTMP. Apresentarei algumas semanas de tormento e provação em um resumo de todas as séries da coleção. Talvez alguém seja útil.





Vamos começar com qual equipamento foi usado para resolver este problema:





Para capturar um fluxo de SDI e transcodificação, um servidor com a seguinte configuração foi usado:





  1. A placa de captura , duas placas testadas, Blackmagic DeckLink Duo 2 e DeckLink Quad 2 , atenderam às nossas expectativas.





  2. Placa de vídeo com suporte de hardware para codec x264 Nvidia Quadro P4000





  3. Servidor baseado no processador Intel (R) Xeon (R) Silver 4114





  4. 64GB de memória





Para enviar o stream para o CDN, usamos:





Servidor Wowza Streaming Engine versão 8.5 ou superior.





Foi decidido capturar do mapa e transferir o fluxo para Wowza por meio do projeto de código aberto FFmpeg . Este produto já se provou bem antes e uma vantagem indiscutível entre outras é gratuito.

Mas para que tudo funcione, precisamos construir o FFmpeg com a lista de módulos necessária, a saber:





  • Suporte DeckLink .





    Para fazer isso, é desejável que as versões não sejam baixadas do produtor do site Blackmagic_DeckLink_SDK abaixo de 10.7, no momento existe a versão 12. https://blackmagicdesign.com Blackmagic_DeckLink_SDK_12.0.zip

    Baixe o unpack no futuro precisaremos especificar o caminho para as bibliotecas na montagem do nosso FFmpeg.





  • Suporta decodificação de hardware





    Você precisa ir ao site da Nvidia e baixar o CUDA para seu sistema operacional na seção de desenvolvedores.





    wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda_11.2.0_460.27.04_linux.run
    sudo sh cuda_11.2.0_460.27.04_linux.run
          
          



  • Decodificando legendas de fluxo SDI ZVBI





    A maioria dos repositórios já tem essa biblioteca, caso contrário, você pode obtê-la em https://sourceforge.net/projects/zapping/files/zvbi/0.2.35/





  • , acc libfdk-aac .





    FFmpeg.

    , , .





FFmpeg .





:





--enable-cuda 
--enable-cuvid 
--enable-nvenc 
--enable-nonfree 
--enable-libnpp 
--extra-cflags=-I/…/cuda/include 
--extra-ldflags=-L/…/cuda/lib64 
--enable-libfdk-aac 
--extra-cflags=-I/…/BlackmagicSDK/Linux/include 
--extra-ldflags=-L/…/BlackmagicSDK/Linux/include 
--enable-decklink 
--enable-libzvbi
      
      



, FFmpeg, FFmpeg .





,

FFmpeg :





ffmpeg







-hwaccel cuvid   ( CUDA)

-f decklink  

-thread_queue_size 16384   8

-teletext_lines all 

-i DeckLink Quad (1)

-c:v h264_nvenc  

-aspect 16:9 -s 1024x576 -filter:v yadif -profile:v main -level 3.1 -preset llhq -gpu any -rc cbrldhq

-g 50 -r 25 -minrate 2000k -b:v 2000k -maxrate 2000k -bufsize 4000k -pixfmt yuv420p

-c:a libfdk-aac -ar 44100 -ac 2 -ab 128k -af volume=10dB -loglevel warning


-metadata:s:s:0 language=rus  , , , - und

-f mpegts udp://...12:6970?pkt_size=1316 mpegts ( FFmpeg), .





Como resultado, teremos um stream com três substreams (Vídeo, Áudio, Legendas), que é o que queríamos!





Agora, para capturar e enviar este fluxo no lado do servidor WOWZA, você precisa criar um Arquivo de fluxo com o seguinte conteúdo no aplicativo necessário:

por meio da web ou manualmente em [wowza] / content /





{
uri: “udp://XXX.XXX.XXX.12:6970?pkt_size=1316”,    
mpegtsDVBTeletextType: “1,2,3,4,5”,   ,   ,     2  5   .
mpegtsDVBTeletextPageNumber: “88”,    888 (  )
reconnectWaitTime: “3000”,         
streamTimeout: “5000”        
}
      
      



Em seguida, nos conectamos a este fluxo e, se tudo foi feito corretamente, o veremos nos fluxos de entrada de seu aplicativo.





Depois disso, podemos ir para Stream Targets de sua aplicação e enviar o stream ao seu destino, no formato RTMP no qual haverá três subfluxos (Vídeo, Áudio e Dados).





Sobre isso, chute tudo, não muito, para uma crítica objetiva, obrigado!








All Articles