Cómo obtener una transmisión subtitulada en RTMP desde SDI

Había una tarea para recibir una transmisión con subtítulos de la señal SDI y enviarla a la CDN en el formato de transmisión RTMP. Presentaré un par de semanas de tormento y ordalía en un resumen de todas las series de la colección. Quizás alguien sea útil.





Comencemos con qué equipo se utilizó para resolver este problema:





Para capturar una secuencia de SDI y transcodificar, se utilizó un servidor con la siguiente configuración:





  1. La placa de captura , dos placas probadas, Blackmagic DeckLink Duo 2 y DeckLink Quad 2 , cumplieron con nuestras expectativas.





  2. Tarjeta de video con soporte de hardware para códec x264 Nvidia Quadro P4000





  3. Servidor basado en el procesador Intel (R) Xeon (R) Silver 4114





  4. 64 GB de memoria





Para enviar la transmisión hacia la CDN, usamos:





Servidor Wowza Streaming Engine versión 8.5 o superior.





Se decidió capturar del mapa y transferir el flujo a Wowza mediante el proyecto de código abierto FFmpeg . Este producto ha demostrado su eficacia antes y una ventaja indiscutible entre otras es que es gratuito.

Pero para que todo funcione, necesitamos construir FFmpeg con la lista necesaria de módulos, a saber:





  • DeckLink.





    Blackmagic_DeckLink_SDK 10.7, 12. https://blackmagicdesign.com Blackmagic_DeckLink_SDK_12.0.zip

    FFmpeg.









  • Nvidia CUDA .





    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
          
          



  • Subtitles SDI ZVBI





    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, obtendremos una transmisión con tres subflujos (video, audio, subtítulos), ¡que es lo que queríamos!





Ahora, para capturar y enviar este flujo en el lado del servidor de WOWZA, debe crear un archivo de flujo con el siguiente contenido en la aplicación requerida:

por medio de la web o manualmente en [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”        
}
      
      



A continuación, nos conectamos a este stream y si hicimos todo correctamente, lo veremos en los Incoming Streams de su aplicación.





Después de eso, podemos ir a Stream Targets de su aplicación y enviar el stream a su destino, en formato RTMP en el que habrá tres substreams (Video, Audio y Data).





Sobre esto, patea todo, no mucho, por críticas objetivas, ¡Gracias!








All Articles