本文的創做靈感是由Windows screen recording with FFmpeg UScreenCapture and NGINX RTMP module而來,筆者建議你們能夠先去原文看一下大體的內容,但須要必定的英文閱讀能力,本文並非照搬翻譯,而是根據原文成功搭建直播系統的基礎上增長了服務器錄製和本地錄製的內容:nginx
系統環境:git
Windows 7 Service Pack 1 64bitgithub
軟件準備:web
ffmpeg:這裏筆者使用原文的地址下載了官方打包好的可執行文件windows
nginx:這裏筆者使用原文的地址下載了編譯好nginx rtmp module的打包文件服務器
UScreenCapture(x64):請參看原文下載地址app
QtAv:筆者在二次開發時選擇的庫 (可選)ide
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。。。
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