SDI信号から字幕付きのブロードキャストを受信し、RTMPストリーム形式でCDNに送信するタスクがありました。コレクションのすべてのシリーズの要約で、数週間の苦痛と試練を紹介します。おそらく誰かが重宝するでしょう。
この問題を解決するために使用された機器から始めましょう。
SDIとトランスコーディングからストリームをキャプチャするために、次の構成のサーバーが使用されました。
キャプチャーボード、テスト済みの2つのボード、Blackmagic DeckLink Duo2とDeckLinkQuad 2は、どちらも私たちの期待に応えました。
ビデオカードコーデックx264のためのハードウェアをサポートしたNVIDIAのQuadroはP4000
Intel(R)Xeon(R)Silver4114プロセッサをベースにしたサーバー
64GBメモリ
CDNに向けてストリームを送信するために、次のものを使用しました。
Wowza StreamingEngineサーバーバージョン8.5以降。
マップからキャプチャし、オープンソースプロジェクトFFmpegを使用してストリームをWowzaに転送することが決定されました。この製品はかなり前にそれ自体が証明されており、とりわけ無料であるという明白な利点があります。
しかし、すべてが機能するためには、必要なモジュールのリストを使用してFFmpegを構築する必要があります。
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), .
その結果、3つのサブストリーム(ビデオ、オーディオ、字幕)を含むストリームが得られます。これが私たちが望んでいたことです。
ここで、WOWZAサーバー側でこのストリームをキャプチャして送信するには、必要なアプリケーションで次のコンテンツを含むストリームファイルを作成する必要があります:
Webを使用するか、[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” }
次に、このストリームに接続します。すべてが正しく行われた場合は、アプリケーションの受信ストリームに表示されます。
その後、アプリケーションのストリームターゲットに移動し、3つのサブストリーム(ビデオ、オーディオ、データ)が存在するRTMP形式でストリームを宛先に送信できます。
これについては、客観的な批判のために、それほど多くはありませんが、すべてを蹴ってください、ありがとう!