基於ffmpeg+nginx+UscreenCapture的區域網直播系統搭建
本文的創作靈感是由Windows screen recording with FFmpeg UScreenCapture and NGINX RTMP module 而來,筆者建議大家可以先去原文看一下大致的內容,但需要一定的英文閱讀能力,本文並不是照搬翻譯,而是根據原文成功搭建直播系統的基礎上增加了伺服器錄製和本地錄製的內容:
系統環境:
Windows 7 Service Pack 1 64bit
軟體準備:
ffmpeg:這裡筆者使用原文的地址下載了官方打包好的可執行檔案
nginx:這裡筆者使用原文的地址下載了編譯好nginx rtmp module的打包檔案
UScreenCapture(x64):請參看原文下載地址
QtAv :筆者在二次開發時選擇的庫 (可選)
vlc-qt :基於vlc的庫(可選),筆者一開始做本地錄製功能的時候選擇了這個庫,但是在嘗試本地播放視訊同時錄製的時候,發現開始錄製後沒有停止錄製的介面,於是就放棄了
libvlc:vlc官方的開源元件,可供其他開發平臺呼叫(可選),上面的vlc-qt是基於Qt開發環境的,如果不依賴Qt可以嘗試用這個庫,不過需要看一下官方的開發文件,筆者並沒有相關開發經驗,就不做過多介紹了
產品需求:
將某臺PC的桌面作為視訊直播源,推送至直播伺服器,可供區域網內的其他PC通過視訊播放器觀看,觀看直播的同時可以隨時開始/停止錄製當前的播放內容
開發步驟:
安裝UScreenCapture(x64),後續作為可用視訊輸入源供ffmpeg使用
點選下載好的nginx目錄中的nginx.exe,啟動nginx伺服器,根據conf資料夾中的nginx.conf配置,此時伺服器會監聽81-web埠和1935-rtmp埠
開啟命令提示符(cmd),輸入以下命令,此命令用於確認是否正確安裝並ffmpeg可以識別UscreenCapture作為視訊流輸入源:
[這裡是ffmpeg資料夾的絕對路徑]/ffmpeg.exe -list_devices true -f dshow -i dummy
[這裡是ffmpeg資料夾的絕對路徑]/ffmpeg -f dshow -i video="UScreenCapture" -preset ultrafast -f flv rtmp://127.0.0.1/view/test
上述程式碼的作用就是,以UScreenCapture作為輸入源,編碼速率設定為ultrafast,編碼格式為flv,將視訊媒體流推送到rtmp://127.0.0.1/view/test這個地址上
當然,其中輸入源可以選擇攝像頭,本地視訊檔案等;編碼速率,格式以及推送地址都可以根據需要進行配置,最終的目的都是為了把本地源推送至伺服器以供遠端播放器使用
測試直播是否正常可以使用ffmpeg資料夾中的ffplay rtmp://127.0.0.1/view/test, 也可以使用其他播放器,如vlc player
如果需要錄製視訊功能,可以選擇以下兩種方案,錄製後的檔案各自儲存的位置不同
-
播放端錄製
使用QtAv的VideoDecoder+VideoEncoder+AVMuxer+AVDemuxer,將播放源進行編解碼後儲存到本地,因為官方沒有正式的例子,下文的程式碼僅供演示使用(程式碼整理中,後續儘快新增)
To Be Continued。。。
-
伺服器端錄製
利用nginx rtmp module的rtmp_control功能,通過HTTP協議在伺服器端進行開始錄製及停止錄製操作,nginx端的配置見下文
server { ...... location /control { rtmp_control all; } } rtmp { server { listen 1935; application view {下面的錄製命令app引數會用到這個配置名 live on; recorder NAME_THIS_WHAT_YOU_WANT { # 下面的錄製命令rec引數會用到這個配置名 record all manual; record_suffix -%Y-%m-%d-%H%M.mp4; record_path C:\\nginx\\recordings; record_unique on; } } } }
rtmp://127.0.0.1/view/test,其中view是伺服器配置的rtmp服務名,test是自定義的視訊流名稱
啟動錄製:http://localhost :81/control/record/start?app=view&name=自定義的視訊流名稱&rec=NAME_THIS_WHAT_YOU_WANT
停止錄製:http://localhost :81/control/record/stop?app=view&name=自定義的視訊流名稱&rec=NAME_THIS_WHAT_YOU_WANT