我想為 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 KB/s
- 一秒鐘,上傳速度約 1500-1600 KB/s
這種模式可以在 a 的輸出中看到nload -t 100
,其中每個字元對應 100ms:
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
我嘗試降低比特率,但隨後圖像變得明顯塊狀。
在一個理想的世界裡,該串流將以十倍以下的頻寬完成:
- 每 2 秒上傳一張螢幕圖片(png 格式約 100 kB)作為關鍵幀
- 否則傳輸音訊和進度條的微小變化的速度低於 100 kB/s
所以問題是,是否有一種 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 KB/s,一秒的高消耗為 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