Docker中的錄屏和推流


雲遊戲初探 - Docker中的錄屏和推流


最近在調研雲遊戲架構,一個比較基本的方式是在雲服務器上運行遊戲,數據流從雲服務器到客戶端,控制流從客戶端到雲服務器。

數據流是指音視頻流,通過屏幕錄製,聲音抓取,將音視頻推流發佈出來,玩家和觀戰用戶可以播放這些音視頻流;

控制流是指玩家操控觸屏、鍵盤、鼠標、遊戲杆的指令序列,通過客戶端發給雲服務器,進而操控遊戲。

當前雲服務主流是用容器實現的,那用docker怎樣錄屏和推流呢?我查閱了一些資料,做了一些實驗,描述如下:

首先啟動Docker實例:

<code>docker run -it -p 1935:1935 --mount type=bind,source=$(PWD)/../games,destination=/mnt gameserver:0.0.1/<code>

注意要端口映射一下,將實例中的1935端口映射到本地;

在Docker實例中安裝必要軟件:

<code>apt-get install -y ffmpeg xvfb pulseaudio socat nginx libnginx-mod-rtmp/<code> 

用Unity3D開發遊戲:

輸出成Linux x86_64格式,掛載到Docker實例中;

(注:在Edit菜單->
Project Settings...菜單項->
Player頁->
Resolution and Presentation段->
Standalone Player Options節中,
將Display Resolution Dialog
設置成Disabled,否則每次運行遊戲都彈出分辨率選擇對話框)

啟動虛擬的X Server:

<code>Xvfb :44 -screen 0 800x600x24/<code>

其中800x600x24是設置分辨率和色彩,44是Server Number,這裡使用44作為一個例子,後面會用到;

配置和啟動帶rtmp模塊的nginx:

在/etc/nginx/nginx.conf中http段前加入

<code>rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
}
}

}/<code>

定義rtmp服務,端口1935已經在啟動Docker實例的時候映射到Host機上了;

啟動nginx服務

<code>service nginx start/<code>

用普通用戶身份運行如下命令:

<code>pulseaudio -D --exit-idle-time=-1
pacmd load-module module-virtual-sink sink_name=v1
pacmd set-default-sink v1
pacmd set-default-source v1.monitor/<code>

執行這些命令的目的是保證遊戲使用聲卡時不出問題(網上搜的,沒仔細研究,本實驗不涉及聲音方面,遊戲執行不因為聲音出錯就行);

啟動遊戲:

<code>DISPLAY=:44 ./game_demo.x86_64/<code>

其中44是前面啟動Xvfb時指定的Server Number,這樣遊戲就把圖像通過虛擬的X Server輸出了;

推流:

<code>ffmpeg \\
\t-f x11grab \\
\t-s 800x600 \\
\t-framerate 12 \\
\t-i :44 \\

\t-preset ultrafast \\
\t-s 800x600 \\
\t-threads 10 \\
\t-codec:v h264 \\
\t-f flv rtmp://localhost:1935/live/game_demo/<code>

其中x11grab表示錄屏,兩個800x600表示輸入和輸出的分辨率,framerate是幀率,44就是剛才啟動遊戲時使用的DISPLAY環境變量值,ultrafast是指定編碼策略,threads表示線程數,視頻編碼用h264,輸出rtmp流到nginx服務中;

也可以通過ffmpeg截取聲音,加到rtmp推流中,這裡省略了;

這個命令就把X中的桌面截取成視頻流,發佈出來,用支持rtmp的播放器就可以播放遊戲視頻了。

流程算是跑通了,效率真的是沒法忍受,啟動視頻需要1分鐘。由於沒有控制流,遊戲延遲就不能測試了(也不用測了,這麼慢)。

上述實驗用到了多個開源和免費的軟件,僅為測試流程,性能優化不在實驗範圍之內。當然架構中還可以用更加高效的編碼、推流技術,比如RTSP,WebRTC等,由於本人不是很熟悉,留待以後考察吧。

還有聲音抓取,GPU加速,GPU虛擬化等等許多問題,都沒有包含在本實驗中,留待。。。

據報道,商用的雲遊戲服務已經開展起來了,專業的架構能夠把延遲縮短到幾十毫秒。相信雲遊戲的未來就在不遠處。


分享到:


相關文章: