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,但是不會影響系統操作。

2011年6月17日 星期五

PulseAudio 主音量與各聲道獨立控制

PulseAudio 在預設的情況下,調整主音量(Master)會跟著調整程式本身的音量(PCM),當你調整其中一個音量控制時,另一個就會被影響。

此時我們可以透過修改 /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common 與 /etc/pulse/daemon.conf 來達到用 Master 控制全域音量且不影響各程式的 PCM 音量。
  1. 在 /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common 中找到 [Element PCM] 這個區塊,並將 volume 從 merge 改成 ignore。
  2. 在 /etc/pulse/daemon.conf 中找到 ;flat-volumes = yes ,並將它的註解拿掉改成 flat-volumes = no。

不知道是不是 PulseAudio 實作的問題,以上的設定在 PulseAudio 剛啟動的時候會變成音量全開,一定要動過主音量以後才會變正常。一個比較醜的懶人方法是在 start-pulseaudio-x11 這個 script 裡加上這兩行:

amixer -D default sset Master "`amixer -D default | grep 'Front Left: Playback' |awk '{print $4-1}'`"
amixer -D default sset Master "`amixer -D default | grep 'Front Left: Playback' |awk '{print $4+1}'`"

這兩行會把 PulseAudio 的 Master 音量先降低 1 單位以後,再加 1 單位回去,讓 PulseAudio 的音量控制正常工作。