red5部署html
前段時間把red5服務器搭建好了,如今記錄下是如何搭建的。
1,下載對應版本的red5
https://github.com/Red5/red5-server/releases
2,若是沒有安裝JAVA環境的安裝JDK並設置環境變量(該步驟自行搜索)java
添加環境變量-系統變量(在Path中補充):%Java_Home%\bin;%Java_Home%\jre\bin;git
注意調整環境變量-系統變量JAVA_HOME(指定到對應的目錄):C:\Program Files\Java\jdk1.8.0_202github
java -version //查看jdk版本web
3,解壓red5到某個目錄下。
4,設置red5環境變量
根據設置Java環境變量的方法,添加red5_home和ClassPath
變量名:red5_home
變量值:F:\red5\Test\red5-server-1.0.5 (此處要根據你的安裝目錄調整)
變量名:ClassPath
變量值:. (不配置此變量,或者此變動的值不是「.」,red5啓動的過程會拋異常)
5,啓動red5
雙擊「red5.bat」文件,啓動red5
6,測試是否啓動成功
在瀏覽器中輸入http://localhost:5080/,可成功打開,表示red5部署成功。
編程
推流和拉流c#
啓用後,打開http://localhost:5080/demos/publisher.html的界面以下圖所示:瀏覽器
上圖是在Web端鏈接Red5服務端的過程,將Locations值該爲rtmp://localhost/myOnline,服務器
rtmp是Red5最主要的流傳輸的協議和服務,除此以外,Red5還支持rtmpt、mrtmp等協議,網絡
簡單說下rtmp協議:它能夠支持網絡數據傳輸、語音視頻流等,因爲它是基於TCP鏈接而構建的通訊協議,所以它的配置參數和服務端的TCP Socket編程模式基本一致。
ip地址欄:localhost,服務器是本地的,使用域名代替真實的Ip地址也能夠,若是服務器在liunx上等,輸入對應的ip地址,這裏不須要端口,端口是默認的,而後再是咱們的項目名。
點擊上圖的connect,在右邊能夠看見Connect Success,說明和服務器通訊成功。鏈接成功後咱們就能夠進行推流和拉流的工做。
接下來,咱們研究一下推流的實現。推流的工具這裏我推薦兩個:OBS(Open Broadcaster Software)和VLC,以OBS爲例子,OBS下載地址:https://obsproject.com/選擇下載對應的版本。安裝完成後以下圖所示(當前的OBS版本爲20.0.1):
默認狀況下,啓動OBS是黑屏的。咱們在「來源」中點擊左下角的「+」,添加「顯示器捕獲」,就能夠顯示當前的桌面,除此以外,還能夠添加「音頻輸入捕獲」、「音頻輸出捕獲」等。
點擊右下角的「設置」,界面以下圖所示:
咱們先關注左邊欄的「流」設置,咱們自定義流媒體服務器,URL爲:
rtmp://localhost/myOnline,與Red5的web端界面Locations一致,流名稱是自定義的,這裏設置值爲11111,能夠任意取,若是有多人在推流,那麼這個流名稱不能重複。
當設置好後,點擊右下角的「肯定」,回到OBS主界面。而後點擊右下角的「開始推流」,以下圖所示:
能夠看到OBS在向Red5本地服務器推流,下面是推流的數據流。這裏就至關因而直播間的播主,固然也能夠進行推流的錄製等,錄製的文件位置在「設置」的「輸出」中設置。
推流的實現已經完成,那麼拉流呢?咱們回到Red5的web端界面,將Names的值也設置爲11111,點擊connect,點擊play,能夠看到Web端在同步播放OBS的視頻內容,就至關於直播同樣,完成了拉流的工做。
到這裏,Red5的基本推拉流工做已經能夠實現了。
再補充以下幾點吧。
1.由於RTMP是Red5最主要的協議和服務,該協議在視頻同步上是有延遲的,延遲大概在2~3秒左右。
2.Red5是能夠在手機移動端完成推流和拉流工做的,這裏推薦一款推拉流APP:易推流,
本人使用的是iphone手機,這個app能夠直接在AppStore下載。手機端拉流的App還可使用VLC,同樣效果很不錯。
App打開的界面以下,在"直播地址"欄,添加本身的直播地址進行推流,而後在電腦端經過VLC拉流,固然你想用手機端進行拉流也能夠。
能夠參考博客:
https://www.cnblogs.com/byteworld/p/5723555.html
SDK相關:
上傳雲端:
發送視頻流
void SendVideoBuffer(object bufferIn)
{
try
{
TcpClient tcp = new TcpClient(PeerIP_TXT.Text, 6000);
NetworkStream ns = tcp.GetStream();
Image buffer = (Image)bufferIn;
buffer.Save(ns, System.Drawing.Imaging.ImageFormat.Jpeg);
ns.Close();
tcp.Close();
}
catch (Exception) { }
}
接收視頻流
Socket server_sock; void server() { try { server_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server_sock.Bind(new IPEndPoint(IPAddress.Any, 6000)); server_sock.Listen(-1); while (true) { try { Socket new_socket = server_sock.Accept(); NetworkStream ns = new NetworkStream(new_socket); pictureBox_Remote.Image = Image.FromStream(ns); ns.Close(); new_socket.Close(); } catch (Exception) { } } } catch(Exception){} }