Comment obtenir un flux sous-titré en RTMP à partir de SDI

Il y avait une tâche pour recevoir une émission avec des sous-titres du signal SDI et l'envoyer au CDN au format de flux RTMP. Je présenterai quelques semaines de tourments et d'épreuves dans un résumé de toutes les séries de la collection. Peut-être que quelqu'un vous sera utile.





Commençons par quel équipement a été utilisé pour résoudre ce problème:





Pour capturer un flux à partir de SDI et de transcodage, un serveur avec la configuration suivante a été utilisé:





  1. Carte de capture , deux cartes testées, Blackmagic DeckLink Duo 2 et DeckLink Quad 2 , toutes deux ont répondu à nos attentes.





  2. Carte vidéo avec prise en charge matérielle du codec x264 Nvidia Quadro P4000





  3. Serveur basé sur un processeur Intel (R) Xeon (R) Silver 4114





  4. 64 Go de mémoire





Pour envoyer le flux vers le CDN, nous avons utilisé:





Serveur Wowza Streaming Engine version 8.5 ou supérieure.





Il a été décidé de capturer à partir de la carte et de transférer le flux vers Wowza au moyen du projet open source FFmpeg . Ce produit a fait ses preuves bien avant et un avantage incontestable parmi d'autres, il est gratuit.

Mais pour que tout fonctionne, nous devons construire FFmpeg avec la liste de modules nécessaire, à savoir:





  • 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), .





En conséquence, nous obtiendrons un flux avec trois sous-flux (vidéo, audio, sous-titres), ce que nous voulions!





Maintenant, pour capturer et envoyer ce flux côté serveur WOWZA, vous devez créer un fichier Stream avec le contenu suivant dans l'application requise:

via le Web ou manuellement dans [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”        
}
      
      



Ensuite, nous nous connectons à ce flux et si nous avons tout fait correctement, nous le verrons dans les flux entrants de votre application.





Après cela, nous pouvons accéder aux cibles de flux de votre application et envoyer le flux à sa destination, au format RTMP dans lequel il y aura trois sous-flux (vidéo, audio et données).





Sur ce coup de pied tout, pas grand chose, pour des critiques objectives, merci!








All Articles