FFMPEG を使用して、ほとんど静止画像をストリーミングする最も軽量な方法は何ですか? (帯域幅の観点から)

FFMPEG を使用して、ほとんど静止画像をストリーミングする最も軽量な方法は何ですか? (帯域幅の観点から)

1 秒あたり 5 回更新されるプログレス バーを備えたラジオのようなストリームを YouTube または Twitch 用に最適化したいと考えています。このプログレス バーを除き、ビデオの他の部分は静的です。約 10 分ごとに、ストリームは新しいトラックに移動し、画面全体が変化します。

明確にするために、画面がどのように見えるかを示すいくつかの図を示します。

トラックの始まりは次のようになります。

+++++++++++++++++++++++++++++
+  First track name         +
+                ,          +
+  BG n⁰1     _ `|.         +
+            /o`=|          +
+     .=""=./::(.=""=.      +
+    /./.' .::::. \'. \     +
+   //\/ / :::::: \/\ \\    +
+  /\/ /\/\'::::'/\ \/\ \   +
+  /' `     '::'     ` `\   +
+           /::\            +
+          /\/\/\           +
+                           +
+  Progress-bar is below    +
+  |                   |    +
+                           +
+++++++++++++++++++++++++++++

10 分ほどの間、進行状況バーにのみ変化が見られます。

+++++++++++++++++++++++++++++
+  First track name         +
+                ,          +
+  BG n⁰1     _ `|.         +
+            /o`=|          +
+     .=""=./::(.=""=.      +
+    /./.' .::::. \'. \     +
+   //\/ / :::::: \/\ \\    +
+  /\/ /\/\'::::'/\ \/\ \   +
+  /' `     '::'     ` `\   +
+           /::\            +
+          /\/\/\           +
+                           +
+  Progress-bar is below    +
+  |==========         |    +
+                           +
+++++++++++++++++++++++++++++

トラックが終了すると、10 分後に画像全体が変わり、新しい背景が表示されます。

+++++++++++++++++++++++++++++
+  Second track name        +
+                           +
+  (the whole screen        +
+   should have refreshed)  +
+                           +
+  BG n⁰2        ,-.        +
+        ,      ( {o\       +
+        {`"=,___) (`~      +
+         \  ,_.-   )       +
+    ~^~^~^`- ~^ ~^ '~^~    +
+                           +
+                           +
+  Progress-bar is below    +
+  |                   |    +
+                           +
+++++++++++++++++++++++++++++

実際の質問に移ると、現在、この ffmpeg コマンドで機能する解決策があります。

 ffmpeg -f x11grab -s "1280x720" -i :99.0+0,0 -f pulse -i default -f flv \
   -vcodec libx264 -b:v 1000k -maxrate 1360k -bufsize 1360k -g 60 -tune stillimage \
   -s "1280x720" -preset veryfast -vf "format=yuv420p" \
   "rtmp://SERVER_EITHER_YOUTUBE_OR_TWITCH/STREAM_KEY"

ただし、このソリューションでは、比較的高い帯域幅消費が発生します。

  • 1秒間にアップロードは900~1000KB/秒の速度で行われる。
  • 1秒間にアップロードは1500~1600KB/秒の速度で行われる。

このパターンは の出力で確認できnload -t 100、各文字は 100 ミリ秒に対応します。

Device eth0 [xyz.xyz.xyz.xyz] (1/1):
====================================================================================
Incoming:
                                                               Curr: 60.77 kBit/s
                                                               Avg: 72.08 kBit/s
                                                               Min: 52.23 kBit/s
                                                               Max: 252.88 kBit/s
                                                               Ttl: 118.24 GByte
Outgoing:

   #||||..|||          #|.|||..|#          #|..|...|#          Curr: 1002.47 kBit/s
   ##########          ##########          ##########          Avg: 1.24 MBit/s
|#|##########.||||##|||##########.||#||##|.##########..||..||  Min: 749.30 kBit/s
#############################################################  Max: 8.83 MBit/s
#############################################################  Ttl: 92.46 GByte

ビットレートを下げようとしましたが、画像が著しくブロック状になりました。

理想的な世界では、このストリームは 10 分の 1 の帯域幅で実行されます。

  • キーフレームとして2秒ごとにアップロードされる画面の画像(pngで約100kB)
  • それ以外の場合は、オーディオとプログレスバーの小さな変化を送信するには100 kB/s未満です。

そこで質問なのですが、ストリーミング サービスの制約 (2 秒ごとに 1 つのキーフレーム) と互換性があり、高品質を維持しながら帯域幅を低くできる ffmpeg 設定はありますか?




編集オプションを使用しようとしたところ-crf 23、ffmpeg コマンドは次のようになりました。

 ffmpeg -f x11grab -s "1280x720" -i :99.0+0,0 -f pulse -i default -f flv \
   -vcodec libx264 -crf 23 -g 60 -tune stillimage \
   -s "1280x720" -preset veryfast -vf "format=yuv420p" \
   "rtmp://SERVER_EITHER_YOUTUBE_OR_TWITCH/STREAM_KEY"

良い面としては、帯域幅が減少したことで、改善が見られます。しかし、帯域幅消費が低い 300 KB/秒の 1 秒間と、帯域幅消費が高い 1300 KB/秒の 1 秒間を示すこの長方形の信号がまだ見られます。

 Device eth0 [xyz.xyz.xyz.xyz] (1/1):                                                 
 =================================================================================
 Incoming:
                                                                 Curr: 76.65 kBit/
                                                                 Avg: 76.11 kBit/s
                                                                 Min: 10.08 kBit/s
                                                                 Max: 9.78 MBit/s
                                                                 Ttl: 118.88 GByte
 Outgoing:
 
                                                                 Curr: 1.26 MBit/s
  ||||||||||          |||||||||          ||||||||||          ||  Avg: 1.09 MBit/s
  ##########          ##########         ##########          ##  Min: 55.66 kBit/s
  ##########         |##########         ##########          ##  Max: 10.86 MBit/s
 ####################################|||#######################  Ttl: 103.00 GByte

関連情報