Я хочу оптимизировать радиоподобный поток для 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