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){} }