Какой самый легкий способ потоковой передачи преимущественно статичного изображения с использованием FFMPEG? (с точки зрения пропускной способности)

Какой самый легкий способ потоковой передачи преимущественно статичного изображения с использованием FFMPEG? (с точки зрения пропускной способности)

Я хочу оптимизировать радиоподобный поток для youtube или twitch, который имеет полосу прогресса, обновляющуюся 5 раз в секунду. За исключением этой полосы прогресса, остальные части видео статичны. Примерно каждые 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"

Однако это решение приводит к относительно высокому потреблению полосы пропускания:

  • в течение одной секунды загрузка происходит со скоростью ~ 900-1000 КБ/с
  • в течение одной секунды загрузка происходит со скоростью ~ 1500-1600 КБ/с

Эту закономерность можно увидеть в выходных данных 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

Я пробовал уменьшить битрейт, но тогда картинка становится заметно блочной.

В идеальном мире, этот поток будет осуществляться с пропускной способностью в десять раз меньшей:

  • изображение экрана (около 100 кБ в формате png), загружаемое каждые 2 секунды в качестве ключевого кадра
  • и в противном случае менее 100 кБ/с для передачи звука и небольших изменений в строке состояния

Итак, вопрос в том,Существует ли настройка ffmpeg, совместимая с ограничениями потоковых сервисов (один ключевой кадр каждые 2 секунды), которая могла бы обеспечить меньшую пропускную способность при сохранении высокого качества?




РЕДАКТИРОВАТЬЯ попробовал использовать эту -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 КБ/с и одной секундой высокого потребления на 1300 КБ/с.

 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

Связанный контент