Usando FFMPEG, ¿cuál es la forma más ligera de transmitir una imagen mayoritariamente estática? (en términos de ancho de banda)

Usando FFMPEG, ¿cuál es la forma más ligera de transmitir una imagen mayoritariamente estática? (en términos de ancho de banda)

Quiero optimizar una transmisión similar a una radio para YouTube o Twitch que presente una barra de progreso que se actualiza 5 veces por segundo. Excepto por esta barra de progreso, las otras partes del vídeo son estáticas. Aproximadamente cada 10 minutos, la transmisión pasa a una nueva pista y toda la pantalla debería cambiar.

Para que quede muy claro, aquí hay algunas ilustraciones de cómo debería verse la pantalla.

El inicio de la pista sería así:

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

Durante aproximadamente 10 minutos, el único cambio estaría en la barra de progreso:

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

Cuando finaliza la pista, después de 10 minutos, la imagen completa debería cambiar para mostrar un nuevo fondo:

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

Para pasar a la pregunta real, actualmente tengo una solución que funciona con este comando 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"

Sin embargo, esta solución da como resultado un consumo de ancho de banda relativamente alto:

  • durante un segundo, la carga se realiza a una velocidad de ~ 900-1000 KB/s
  • durante un segundo, la carga se realiza a una velocidad de ~ 1500-1600 KB/s

Este patrón se puede ver en la salida de a nload -t 100, donde cada carácter corresponde a 100 ms:

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

Intenté reducir la tasa de bits pero luego la imagen se vuelve notablemente bloqueada.

En un mundo ideal, esta transmisión se realizaría con diez veces menos ancho de banda:

  • una imagen de la pantalla (aproximadamente 100 kB en png) cargada cada 2 segundos como fotograma clave
  • y en caso contrario menos de 100 kB/s para transmitir el audio y los pequeños cambios en la barra de progreso

Entonces la pregunta es,¿Existe una configuración de ffmpeg compatible con las limitaciones de los servicios de streaming (un fotograma clave cada 2 segundos) que pueda lograr un ancho de banda menor manteniendo una alta calidad?




EDITARIntenté usar la -crf 23opción y el comando ffmpeg quedó así:

 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"

Lo bueno es que el ancho de banda disminuyó y eso es una mejora. Pero sigo viendo esta señal rectangular, con un segundo de bajo consumo de ancho de banda a 300 KB/s y un segundo de alto consumo a 1300 KB/s.

 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

información relacionada