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 23
opció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