1. 程式人生 > >2_本地直播平臺的搭建—四種方式(20181116)

2_本地直播平臺的搭建—四種方式(20181116)

本地直播平臺的搭建—五種方式


最近業務功能需要加入直播,所以就研究了一下,搞一搞,搞毛線呀,不對,是搞事情呦!!!

下面的這張圖是直播的大概流程
圖片來源知乎

在這裡插入圖片描述

方法一:Windows下用FFmpeg+nginx+rtmp搭建直播環境 實現推流、拉流 (測試通過

檔案說明:FFmpeg+nginx+例項視訊.zip 解壓之後是連個解壓檔案和一個視訊檔案
在這裡插入圖片描述

環境

  • 開發環境:windows
  • 開發工具:FFmpeg、nginx、nginx-rmtp-module

1. 簡介:

Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。 nginx-rmtp-module是Nginx伺服器的流媒體外掛。nginx通過rtmp模組提供rtmp服務, ffmpeg推送一個rtmp流到nginx, 然後客戶端通過訪問nginx來收看實時視訊流

2. 準備檔案

需要的配置檔案,這裡我就全部整理好了,包括Nginx、nginx-rmtp-module、FFmpeg和例項mp4視訊, 大家可以安心下載(CSDN遮蔽了百度網盤 大家可複製網址到瀏覽器下載):
連結: https://pan.baidu.com/s/1lN1ps0ZhCb-1A56ycNR88g
密碼: 2t88

3. 啟動nginx伺服器

進入windows的cmd;

  • cd nginx-1.7.11.3-Gryphon //進入nginx的目錄
  • nginx.exe -c conf\nginx-win-rtmp.conf //執行rtmp配置檔案
    注意此時命令列會一直處於執行中 不用理會 也不要關閉(這個下次開機的時候也要執行開啟,否則下面的IP會顯示無效)

測試:瀏覽器輸入localhost:80 ,如果出現如下頁面 說明配置nginx啟動成功!
在這裡插入圖片描述

注意:nginx.exe -c conf\nginx-win-rtmp.conf 報錯:nginx啟動報錯(1113: No mapping for the Unicode character exists in the target multi-byte code page)
原因: 是因為nginx的路徑中有中文字,改成英文即可

4. 配置FFmpeg

解壓:將ffmpeg解壓到指定目錄 我這裡是D:\ffmpeg
環境配置:右鍵我的電腦(win10是此電腦) – 》 屬性 --》 高階系統設定 --》高階 --》環境變數–》開啟Path ,將 D:\ffmpeg\bin (你的ffmepg解壓目錄下的bin目錄的絕對路徑)新增到Path 路徑下;具體方法不會的可以的百度
測試:開啟windows 的cmd (不要關閉前面的nginx) 輸入ffmpeg -help 如果出現如下情況 說明配置成功!
在這裡插入圖片描述

5.執行

將下載的orange.mp4檔案放到桌面
新開啟windows的cmd (不要關閉之前的ngnix)進入桌面資料夾
然後輸入一下指令:

ffmpeg -re -i orange.mp4 -vcodec libx264 -acodec aac -f flv rtmp://你的ip地址:1935/live/home

 // 注意:192.168.1.53是我電腦的ip地址,需要替換成你的ip地址 (ip地址可通過cmd 的ipconfig指令獲取)

 //例如:ffmpeg -re -i orange.mp4 -vcodec libx264 -acodec aac -f flv rtmp://192.168.1.53:1935/live/home

電腦開啟vlc播放器 輸入地址:rtmp://你的ip地址:1935/live/home
然後先點選命令列回車 再點選播放 然後你就會看到文章開頭的這張圖 大功告成! (注意協議的名稱是rtmp)
在這裡插入圖片描述

注意:如果沒有通,把vlc中的rtmp://你的ip地址:1935/live/home手動刪除,重新輸入 )

方法二:開啟兩個VLC,一個作為推流,一個最為拉流 (udp直播視訊,測試已經通過

(這其實相當於是點播,因為我播放的是本地的視訊檔案(是一個已經錄製好的視訊),淡然你也可以選擇開啟捕捉裝置)

1. 推流設定:

1.1 點選流,進入推流設定頁面

在這裡插入圖片描述

1.2 點選檔案—>新增—>串流

在這裡插入圖片描述

1.3 選擇通訊協議,UDP(User Data Protocol, 使用者資料報協議),轉碼後的流通過UDP協議進行傳輸

(本地顯示,我猜就是在直播的視訊上會顯示IP地址,只有拉流成功接收視訊,在視訊剛開始播放的開頭會有類似水印的IP地址,見下面的拉流視訊)
在這裡插入圖片描述

然後點選新增,之後就新增本地的IP地址,埠是預設的1234(地址處輸入自己電腦的IP地址,設定埠號(0-65535))
在這裡插入圖片描述

1.4 轉碼,視訊轉碼的格式選擇的是H264 +MP3(TS),選好之後點選下一個

在這裡插入圖片描述

1.5 最後點選流, 推流設定完成

在這裡插入圖片描述

推流的介面:(推流的視訊播放完之後可以再點選,然後繼續推流)
在這裡插入圖片描述

2. 拉流設定:

再開啟一個VLC進行拉流,用於播放推流過來的視訊。

2.1 點選:媒體---->開啟網路串流:

在這裡插入圖片描述

2.2 輸入上面推流到的IP地址:

輸入相應的地址:udp://@IP:埠號,點選播放,就可以接收視訊了。
注意:UDP協議的IP地址前面要加上@符號 # 測試@ 必須要加上,不加沒有通,正常一般在@前填寫的是 使用者名稱:密碼 (因為沒有使用者和密碼,我認為不寫@應該也是可以的)
在這裡插入圖片描述

3. 點選播放之後,拉流成功(下面是測試成功的畫面):

測試:當本機只開了一個VLC作為推流的時候,此時也只能開一個VLC作為拉流
注意:這裡使用的IP地址是在一個區域網之間的IP,也就是說,如果A想將視推給B看,那麼首先他們必須在同一個局域網裡面,其次,輸入的IP必須是B的IP地址。
在這裡插入圖片描述

注意:在用媒體中的捕獲裝置的時候,用攝像頭開啟實施視訊流,攝像頭已經打開了,拉流的時候進度條也在走,但是拉流端沒有畫面,具體原因還不知道(選的是UDP傳輸協議)

方法三:FFmpeg實時推流攝像頭,Nginx RTMP模組轉發,VLC播放器播放實現直播(測試通過):

1. 推流:

1.1 檢視本機電腦的裝置

ffmpeg -list_devices true -f dshow -i dummy

紅色標記表示視訊裝置和麥克風裝置
在這裡插入圖片描述
看到亂碼了吧!到裝置管理器中去檢視吧,有具體的名稱,下面在推流的的時候,要把攝像頭和麥克風的引數名換成本機對應的裝置名稱。
在這裡插入圖片描述

1.2 FFmpeg編碼推送到RTMP伺服器

ffmpeg -f dshow -i video=“Integrated Camera”:audio=“麥克風 (Realtek® Audio)” -vcodec libx264 -acodec copy -preset:v ultrafast -tune:v zerolatency -f flv “rtmp://192.168.1.53:1935/live/home”

在這裡插入圖片描述
:nginx.exe -c conf\nginx-win-rtmp.conf //執行rtmp配置檔案
注意:此時命令列會一直處於執行中 不用理會 也不要關閉,這個操作再次開機的時候要執行,否則會顯示IP地址無效,推流失敗的。開機執行之後再關閉是可以的,不知道是不是每次開機都要載入一下配置環境還是為什麼,原因目前還不太清楚。

2. 拉流 (畫面中的人物請忽略 )

使用VLC檢視拉流直播

rtmp://192.168.1.53:1935/live/home # 可能會有延遲,需要等待一下
在這裡插入圖片描述

同時也是支援一個推流多個拉流
在這裡插入圖片描述

方法四:obs+nginx+vlc搭建流媒體直播平臺

1 流服務設定

在這裡插入圖片描述

2 開啟流服務:

在cmd下開啟nginx.exe,此時上面的配置檔案生效

nginx.exe -c conf\nginx-win-rtmp.conf

在這裡插入圖片描述

3 obs推流設定 (這裡我沒有加埠號)

(推理地址也可以加上埠號,rtmp://192.168.1.53:1935/live, 此時vlc的拉流地址,也要加上埠,一定要保持兩者一致。當然也可以不加)

推流設定如下:
在這裡插入圖片描述
推流URL設定好之後,點選推流就可以,(推流和停止推流同一個按鈕)

在這裡插入圖片描述

5 vlc拉流設定

拉流的地址和推流的是設定一樣,點選媒體中的 流—>網路—>填寫IP—>最後點選播放
(推流的和拉流的地址都是一樣的,記住)

在這裡插入圖片描述

方法五: 方法與方法三幾乎一樣,結合業務需求,把實時風格轉移,在直播流中實現(測試通過

實時風格轉移程式碼就不貼了,這裡有一個龐大的工作量

1. 推流

ffmpeg -f dshow -i video=“Integrated Camera”:audio=“麥克風 (Realtek® Audio)” -vcodec libx264 -acodec copy -preset:v ultrafast -tune:v zerolatency -f flv “rtmp://192.168.1.53:1935/live/home” # 後面的IP可以不用加引號

2. 實現是先拉流,然後實現風格的轉移

python E:\LearnVideo\LearnPoints\4_MS_project\1_neural-style-transfer\neural_sytle_push_streaming_improving.py --models model_test

3. 測試結果:

(後面的小姐姐,我不是故意的,我截圖的時候你恰巧入境,你說巧不巧)
在這裡插入圖片描述
在這裡插入圖片描述

相關資料拓展(俺不是計算機出身,好多概念不懂呀,能有啥辦法呀)

用到的幾種協議

  1. RTMP是Real Time Messaging Protocol(實時訊息傳輸協議)的首字母縮寫。該協議基於TCP,是一個協議族,包括RTMP基本協議及RTMPT/RTMPS/RTMPE等多種變種。RTMP是一種設計用來進行實時資料通訊的網路協議,主要用來在Flash/AIR平臺和支援RTMP協議的流媒體/互動伺服器之間進行音視訊和資料通訊。

  2. UDP 是User Datagram Protocol的簡稱, 中文名是使用者資料報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,IETF RFC 768是UDP的正式規範。UDP在IP報文的協議號是17。

  3. TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。在簡化的計算機網路OSI模型中,它完成第四層傳輸層所指定的功能,使用者資料報協議(UDP)是同一層內[1] 另一個重要的傳輸協議。在因特網協議族(Internet protocol suite)中,TCP層是位於IP層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像管道一樣的連線,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。 [1]

  4. RTSP(Real Time Streaming Protocol),RFC2326,實時流傳輸協議,是TCP/IP協議體系中的一個應用層協議。該協議定義了一對多應用程式如何有效地通過IP網路傳送多媒體資料。RTSP在體系結構上位於RTP和RTCP之上,它使用TCP或UDP完成資料傳輸。