音视频推流同步
类图
协议
传输协议 : 长连接(断开重连) 短连接(三次握手,开销大)
Rtmp
优点:实时协议,收到数据,立刻转发,延时小,主流CDN支持
缺点:1.基于TCP协议相对UDP开销大(TCP面向字节拼接,头部复杂) 2.有序校验次序 3.TCP每发送的数据包,对方都要确认
UDP 是一个面向报文(报文可以理解为一段段的数据)的协议。意思就是 UDP 只是报文的搬运工,不会对报文进行任何拆分和拼接操作,也会校验包对不对,但不管是否收到。因此 1.无连接 2.不可靠 3.没有拥塞控制
HLS :数据包一个一个发,延时大
Rtmp协议类型
握手:不仅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
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复制路径
关闭重启
输入http://IP地址:8090/stat
每刷新一下,数据都会不同
用ffmpeg自带的ffplay播放
#nobuffer没有缓冲
ffplay rtmp://IP地址/live -fflags nobuffer
file_to_rtmp
F:\App_data\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe
所有的调试路径放到bin下面,在调试发生问题的时候,需要查看一下工作目录是否变掉(不然找不到dill文件)
工作目录表示点击调试 后,程序在哪个目录下运行(windows执行程序会到当前路径去找dll文件,linux会到环境命令下去找)
点击“生成解决方案”这时候就生成
总结:选择使用Visual studio编译快速理解公司的项目,不能盲目敲代码调bug,虽然进程慢点,但来龙去脉对解决工程问题很重要哦!
编译exe是要存在dill当中的
没有库是链接的时候错误,不是编译