nginx 实现推流和拉流 nginx推流延迟_UDP

音视频推流同步

nginx 实现推流和拉流 nginx推流延迟_IP_02

类图

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_03

协议

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_04

传输协议 : 长连接(断开重连)  短连接(三次握手,开销大)

Rtmp 

优点:实时协议,收到数据,立刻转发,延时小,主流CDN支持             

缺点:1.基于TCP协议相对UDP开销大(TCP面向字节拼接,头部复杂) 2.有序校验次序 3.TCP每发送的数据包,对方都要确认

UDP 是一个面向报文(报文可以理解为一段段的数据)的协议。意思就是 UDP 只是报文的搬运工,不会对报文进行任何拆分和拼接操作,也会校验包对不对,但不管是否收到。因此 1.无连接 2.不可靠 3.没有拥塞控制

  • 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了
  • 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作

 HLS :数据包一个一个发,延时大

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_05

Rtmp协议类型

  1. 工作在TCP之上的“明文协议”(抓包时,可抓出整个通信协议的过程,https就是加密的,但也可破解漏洞),使用端口1935
  2. RtmpT封装在Http请求之中,可穿越防火墙
  3. RtmpS封装RtmpT,但使用的是Https连接

握手:不仅TCP三层握手,本身Rtmp也有握手

推流

准备工作以下为centOS

yum install wget cmake

yum install openssl-devel  #头文件和静态库

ubuntu下会报错No package libssl-dev available. 

nginx 实现推流和拉流 nginx推流延迟_UDP_06

wget https://codeload.github.com/j0sh/crtmpserver/zip/centosinit
unzip centosinit
cd crtmpserver-centosinit/
cd builders/cmake
cmake .                #在当前路径生成Makefile
make                   #编译

nginx 实现推流和拉流 nginx推流延迟_UDP_07

运行启动程序

#传递参数是这个lua的脚本(所有的参数和配置都可以在这个lua脚本中执行)
#音视频lua性能很好,很好嵌入C++
./crtmpserver/crtmpserver ./crtmpserver/crtmpserver.lua

nginx 实现推流和拉流 nginx推流延迟_IP_08

这样就启动成功了

nginx 实现推流和拉流 nginx推流延迟_UDP_09

下载ffmpeg https://ffmpeg.zeranoe.com/builds/

nginx 实现推流和拉流 nginx推流延迟_IP_10

nginx 实现推流和拉流 nginx推流延迟_nginx_11

解压后可以把它.exe的路径放入环境变量path中,这样在任一位置即可访问

nginx 实现推流和拉流 nginx推流延迟_nginx_12

    

nginx 实现推流和拉流 nginx推流延迟_IP_13

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

所用到的库

nginx 实现推流和拉流 nginx推流延迟_IP_14

然后make    ->     make install           默认都安装在/usr/local/nginx下

nginx 实现推流和拉流 nginx推流延迟_UDP_15

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_16

 别轻易使用rm /usr/local/nginx -r 在公司里可能会把有用的web等其他搭建的删掉

在/usr/local/nginx/sbin/下输入

./nginx

启动 

nginx 实现推流和拉流 nginx推流延迟_IP_17

输入IP地址

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_18

 直播

快速进入

cd /usr/local/nginx/conf
vim nginx.conf
#RTMP服务
rtmp
 {
         server
         {
                 listen 1935;
                 chunk_size 4096;   #块大小
                 application live   #直播名字配置
                 {
                          live on;   #开启
                 }
         }
 }

退掉进程

pkill nginx

 仍然端口占用

nginx 实现推流和拉流 nginx推流延迟_nginx_19

之前开启的srs 服务器占据1935端口

pkill srs

nginx 实现推流和拉流 nginx推流延迟_UDP_20

在windows cmd上 ,我的下载的视频zhangyi.flv就放在youku_dowload文件夹下

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_21

成功推流

nginx 实现推流和拉流 nginx推流延迟_UDP_22

这里的mp4格式仍需转成flv,清晰度会差一点,可以copy

ffmpeg -i zhangyi.flv -c copy -f flv rtmp://IP地址/live

VLC播放效果 (直播:即推流中拉流才可播放)

nginx 实现推流和拉流 nginx推流延迟_nginx_23

通过网页查看直播推流的状态

在nginx-rtmp-module下就有一个stat.xsl

nginx 实现推流和拉流 nginx推流延迟_UDP_24

root路径 -> pwd复制路径

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_25

nginx 实现推流和拉流 nginx推流延迟_nginx_26

关闭重启

nginx 实现推流和拉流 nginx推流延迟_IP_27

输入http://IP地址:8090/stat

nginx 实现推流和拉流 nginx推流延迟_IP_28

每刷新一下,数据都会不同

nginx 实现推流和拉流 nginx推流延迟_UDP_29

用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文件)

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_30

工作目录表示点击调试 后,程序在哪个目录下运行(windows执行程序会到当前路径去找dll文件,linux会到环境命令下去找)

nginx 实现推流和拉流 nginx推流延迟_UDP_31

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_32

nginx 实现推流和拉流 nginx推流延迟_nginx 实现推流和拉流_33

点击“生成解决方案”这时候就生成

nginx 实现推流和拉流 nginx推流延迟_IP_34

 

总结:选择使用Visual studio编译快速理解公司的项目,不能盲目敲代码调bug,虽然进程慢点,但来龙去脉对解决工程问题很重要哦! 

 编译exe是要存在dill当中的

没有库是链接的时候错误,不是编译

nginx 实现推流和拉流 nginx推流延迟_nginx_35