2014-09-12

Linux 進行桌面 Stream (2)

由於 justin.tv 已經終於止服務,在下上次編寫的文章都告同一命運

因此在下再次編寫文章的第二版本
由於希望使用者不需要花太多時間學習 FFmpeg 指令,因此在下將選項設定值獨立成可閱讀的變數名(盡量)
#/bin/bash
# live-ams - Amsterdam, NL 阿姆斯特丹
# live-arn - Stockholm, SE 斯德哥爾摩
# live-cdg - Paris, FR 巴黎
# live-dfw - Dallas, TX 達拉斯
# live-fra - Frankfurt, Germany 法蘭克福
# live-hkg - Hong Kong 香港
# live-iad - Ashburn, VA 阿什本
# live-jfk - New York, NY 紐約
# live-lax - Los Angeles, CA 洛杉磯
# live-lhr - London, UK 倫敦
# live-mia - Miami, FL 邁阿密
# live-prg - Prague, CZ 布拉格
# live-sel - Seoul, South Korea 首爾
# live-sin - Singapore 新加坡
# live-syd - Sydney 雪梨
# live-tpe - Taipei, Taiwan 台北
# live-tyo - Tokyo, Japan 東京
# live - San Francisco, CA 三藩市
stream_server='live-hkg'
stream_key=''
x='0'
y='0'
in_width='800'
in_height='600'
out_width='800'
out_height='600'
video_source='x11grab'
video_input=':0.0'
video_codec='libx264'
video_bitrate='1200k'
audio_source='alsa'
audio_input='default'
audio_codec='libmp3lame'
audio_bitrate='128k'
audio_rate='44100'
audio_channels='2'
output_format='flv'
fps='30'
constant_bitrate='2000k'
rendering_format='yuv420p'
rendering_quality='ultrafast'
rendering_tune='film'
rendering_threads='2'
rednering_strict='normal'
i_frame_interval=$(($fps*2))
i_frame_interval_min=$fps

ffmpeg \
-f "${video_source}" -s "${in_width}x${in_height}" -r "${fps}" -i "${video_input}+${x},${y}" \
-f "${audio_source}" -i "${audio_input}" \
-f "${output_format}" \
-ab "${audio_bitrate}" -ac "${audio_channels}" -ar "${audio_rate}" \
-vcodec "${video_codec}" -vb "${video_bitrate}" -g "${i_frame_interval}" -keyint_min "${i_frame_interval_min}" -b "${constant_bitrate}" -minrate "${constant_bitrate}" -maxrate "${constant_bitrate}" -pix_fmt "${rendering_format}" \
-s "${out_width}x${out_height}" -preset "${rendering_quality}" -tune "${rendering_tune}" -acodec "${audio_codec}" -threads "${rendering_threads}" -strict "${rednering_strict}" \
-bufsize "${constant_bitrate}" "rtmp://${stream_server}.twitch.tv/app/${stream_key}"
使用者最主要是設定 stream_server, stream_key, x, y, in_width, in_height, out_width, out_height
桌面及 stream 矩形都是以左上角為 (0,0) 座標
x 及 y 是相對桌面座標的位置,x 及 y 都不能小於 0 ,而且分別不能大於桌面闊度及桌面高度
in_width 及 in_height 分別是 stream 矩形的闊度及高度,都不能小於 1 ,而且 x + in_width 及 y + in_height 分別不能大於桌面闊度及桌面高度
out_width 及 out_height 分別是 stream 到的 RTMP 伺服器 的影片闊度及高度
但 out_width 及 out_height 不能是任意大小,必須是指定大小,例如:
320x240, 640x480, 720x480, 1280x720, 1920x1080 之類
否則會出錯
若果 stream 的速度不流暢, stream_server 可以選擇其他能提供較流暢的 RTMP 伺服器位置
stream_key 是由 RTMP 伺服器所提供,可以在 http://www.twitch.tv/<your-twitch-account>/dashboard/streamkey 找到

見下文
按下「Show Key」顯示 Stream Key

見下文
與 justin.tv 的 Stream Key 相同,是一個不應該讓自己以外的使用者知道的資料
擁有 Stream Key 的使用者可以不需要登入便可以以閣下的帳戶 stream 影像
若果被自己以外的使用者知道,必須要按「Reset」重設 Stream Key

由於經常在 Linux 進行聲音收集時,選取錯誤的聲音頻道,導致不能正常錄音
因此將 pulse 改為 default 讓系統自動選取合適的聲音頻道

同樣建議使用 PulseAudio Volume Control 來管理聲音音量等設定會較簡單
輸入
sudo apt-get install pavucontrol
來安裝

開啟 PulseAudio Volume Control

見下文
先檢查 Configure
在內建音訊中確定是使用 類比立體聲雙工
確保音訊能進行輸入與輸出

見下文
在 Input Device
在 Show 選擇 All Input Devices
選取聲音頻道,例如在下的聲音頻道為 Monitor of 內建音訊 類比立體聲

見下文
在 Output Device
在 Show 選擇 All Output Devices
查看哪一條聲音頻道有音訊活動,例如在下聲音頻道為 內建音訊 類比立體聲 使用 類比輸出
正常情況下,輸入及輸出的設定、運作正常,便可以透過 line out 裝置聽到正在播放的聲音

見下文
在 Recording
在 Show 選擇 All Streams
將由 FFmpeg 收集的聲音來源設定為與 Input Device 相同

見下文
見下文
在 Playback
在 Show 選擇 All Streams
由於使用 ALSA ,若需要調整 stream 時的音量,除了調整整體的音量,還可以調整指定 stream 的音量
例如在第二幅圖中有很多不同的聲音來源 (圖片由 0079 提供)

在下是使用 Linux Mint 17
由於 Ubuntu 不再提供 FFmpeg 的 repository ,因此 Linux Mint 17 不能透過 Ubunut 安裝 FFmpeg
使用者需要自行到 FFmpeg 的官方網 下載原始碼進行編譯

尋找由其他開發者提供的 FFmpeg PPA ,Launchpad 是一個不錯的選擇
但 Launchpad 開發者所提供的 FFmpeg 並非最新版本,若需要使用最新版本便需要使用 FFmpeg 官方源始碼
可以使用以下指令加入 PPA 並安裝 FFmpeg
sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get install ffmpeg

見下文
見下文
安裝 FFmpeg 後便可以執行以上的 Shell Script
(借用 Compiz 只是強調是使用 Linux 進行 stream ,並沒有實際意義)

見下文
需要停止 FFmpeg 按 Ctrl + C 即可

這方法看來非常複雜,但暫時在 Linux 未有較好的桌面 Stream 操作
比較值得期待的是 Open Broadcaster Software (OBS) 已不斷進行開發
現階段已經提供 Mac OS X 版本,而 Linux 版本仍在開發中
希望不久在將來在 Linux 進行桌面 Desktop 會更簡單

沒有留言 :

張貼留言