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