音视频推流同步
类图
协议
传输协议 : 长连接(断开重连) 短连接(三次握手,开销大)
Rtmp
优点:实时协议,收到数据,立刻转发,延时小,主流CDN支持
缺点:1.基于TCP协议相对UDP开销大(TCP面向字节拼接,头部复杂) 2.有序校验次序 3.TCP每发送的数据包,对方都要确认
UDP 是一个面向报文(报文可以理解为一段段的数据)的协议。意思就是 UDP 只是报文的搬运工,不会对报文进行任何拆分和拼接操作,也会校验包对不对,但不管是否收到。因此 1.无连接 2.不可靠 3.没有拥塞控制
- 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了
- 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作
HLS :数据包一个一个发,延时大
Rtmp协议类型
- 工作在TCP之上的“明文协议”(抓包时,可抓出整个通信协议的过程,https就是加密的,但也可破解漏洞),使用端口1935
- RtmpT封装在Http请求之中,可穿越防火墙
- RtmpS封装RtmpT,但使用的是Https连接
握手:不仅TCP三层握手,本身Rtmp也有握手
推流
准备工作以下为centOS
yum install wget cmake
yum install openssl-devel #头文件和静态库
ubuntu下会报错No package libssl-dev available.
wget https://codeload.github.com/j0sh/crtmpserver/zip/centosinit
unzip centosinit
cd crtmpserver-centosinit/
cd builders/cmake
cmake . #在当前路径生成Makefile
make #编译
运行启动程序
#传递参数是这个lua的脚本(所有的参数和配置都可以在这个lua脚本中执行)
#音视频lua性能很好,很好嵌入C++
./crtmpserver/crtmpserver ./crtmpserver/crtmpserver.lua
这样就启动成功了
下载ffmpeg https://ffmpeg.zeranoe.com/builds/
解压后可以把它.exe的路径放入环境变量path中,这样在任一位置即可访问
ffmpeg -i zhangyi.flv -f flv rtmp://IP地址/live
nginx流媒体服务器搭建
sudo apt-get install libssl-dev
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
sudo apt-get install zlib1g-dev
这些都在ubuntu下,centos找对应的就行
下载nginx并配置rtmp模块
wget http://nginx.org/download/nginx-1.13.3.tar.gz
tar -zxvf nginx-1.13.3.tar.gz
git clone https://github.com/arut/nginx-rtmp-module.git
./configure --add-module=/home/jiangzongqing/project/nginx_server/nginx-rtmp-module
所用到的库
然后make -> make install 默认都安装在/usr/local/nginx下
别轻易使用rm /usr/local/nginx -r 在公司里可能会把有用的web等其他搭建的删掉
在/usr/local/nginx/sbin/下输入
./nginx
启动
输入IP地址
直播
快速进入
cd /usr/local/nginx/conf
vim nginx.conf
#RTMP服务
rtmp
{
server
{
listen 1935;
chunk_size 4096; #块大小
application live #直播名字配置
{
live on; #开启
}
}
}
退掉进程
pkill nginx
仍然端口占用
之前开启的srs 服务器占据1935端口
pkill srs
在windows cmd上 ,我的下载的视频zhangyi.flv就放在youku_dowload文件夹下
成功推流
这里的mp4格式仍需转成flv,清晰度会差一点,可以copy
ffmpeg -i zhangyi.flv -c copy -f flv rtmp://IP地址/live
VLC播放效果 (直播:即推流中拉流才可播放)
通过网页查看直播推流的状态
在nginx-rtmp-module下就有一个stat.xsl
root路径 -> pwd复制路径
关闭重启
每刷新一下,数据都会不同
用ffmpeg自带的ffplay播放
#nobuffer没有缓冲
ffplay rtmp://IP地址/live -fflags nobuffer
代码驱动这些推流,拉流操作
使用ffmpeg SDK推流
- 播放文件推流
- 使用浏览器flash播放直播
- 大华海康相机rtsp推流
开发环境
- ffmpeg 64 dev share
- 使用vs2017编译工具
file_to_rtmp
- src :源文件
- bin :执行目录,这部分是给客户的 (.dill文件和ffmpeg)
- lib :编译用到的库文件(一个.lib是和一个.dill对应的)
- include :头文件
- doc :文档
F:\App_data\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe
所有的调试路径放到bin下面,在调试发生问题的时候,需要查看一下工作目录是否变掉(不然找不到dill文件)
工作目录表示点击调试 后,程序在哪个目录下运行(windows执行程序会到当前路径去找dll文件,linux会到环境命令下去找)
点击“生成解决方案”这时候就生成
总结:选择使用Visual studio编译快速理解公司的项目,不能盲目敲代码调bug,虽然进程慢点,但来龙去脉对解决工程问题很重要哦!
编译exe是要存在dill当中的
没有库是链接的时候错误,不是编译