2011年6月22日 星期三

在 Linux 下使用 FFmpeg 進行實況

除了 VLC + jtvlc 這個組合之外,FFmpeg 也可以用來進行實況。而且 FFmpeg 不只可以用在 Justin.tv,連 Ustream 也可以上傳。正確的說是可以直接當 Adobe Flash Media Live Encoder 用。

FFmpeg 和 jtvlc 不同,你只需要給 FFmpeg 你的串流密鑰,不需要帳號名稱。以下是一個實況桌面的指令範例:

ffmpeg -f x11grab -s 640x480 -framerate 60 -i :0.0+300,300 -f alsa -ac 2 -i default -vcodec libx264 -vpre medium -s 640x480 -b 800k -bt 400k -acodec libfaac -ab 128k -threads 0 -f flv "rtmp://live.justin.tv/app/live_???????_???????? flashver=FMLE/3.0%20(compatible;\20FMSc/1.0)"

這個指令會擷取從螢幕左上角算起座標 300, 300 的地方,大小 640x480 的視窗內容,並且擷取 ALSA 的 default 裝置,格式為立體聲。輸出的視訊格式為 H.264,採用 medium preset 設定值,並使用固定位元率 800kbps、可容忍的變動範圍為 400kbps,音訊格式為 AAC,位元率 128kbps。後面 live_????????_???????? 就是你的串流密鑰,請參考前面 VLC + jtvlc 的文章取得你的密鑰。

如果你要在 Ustream 實況,那麼你得先到 Dashboard >> Manage My Channel >> Advanced Settings 下載給 FME 用的 xml 檔,裡面會寫需要的 url 和密鑰。要注意的是密鑰後面連著 offair 的字串,把那六個字元去掉才是真正的密鑰。

Ustream 的完整 url 大概長這樣:

rtmp://1.1234567.fme.ustream.tv/ustreamVideo/1234567/abcdefghijklmnopqrstuvwxyzABCDEF flashver=FMLE/3.0%20(compatible;\20FMSc/1.0)

1234567代表你的 channel code,密鑰則是大小寫英文加數字共32 bytes。

個人使用的經驗是覺得 FFmpeg 用來實況桌面的 CPU 使用率遠低於 VLC,VLC在擷取大畫面的時候會造成 Xorg 的使用率滿載並造成系統反應緩慢,FFmpeg在錄影的時候雖然也很吃 CPU,但是不會影響系統操作。