基于NGINX实现RTMP推流服务器

您所在的位置:网站首页 ffmpeg流媒体服务器 基于NGINX实现RTMP推流服务器

基于NGINX实现RTMP推流服务器

#基于NGINX实现RTMP推流服务器| 来源: 网络整理| 查看: 265

1、RTMP概念:

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。

该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。

RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。

2、nginx-rtmp-module

开源的nginx-rtmp-module模块,封装了rtmp server。用此模块可以很简单提供RTMP服务

【模块地址】https://github.com/arut/nginx-rtmp-module

3、实践搭建RTMP服务器(模拟直播效果):3.1准备三个软件如下:(点击链接下载,3个工具都封装好了) 戳链接:https://download.csdn.net/download/XuHang666/12003368流媒体服务器 : nginx(含nginx-rtmp-module) linux版推流软件: ffmpeg windows版rmtp流播放软件:EVPlayer windows版3.2第一步:3.2.1在linux服务器安装nginx包,本人是在centos7装的

安装完成后,执行nginx -V确认ok

3.2.2编辑nginx配置文件

vi /etc/nginx/nginx.conf如下

user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } rtmp { server { listen 1935; chunk_size 4096; application live { live on; hls on; hls_path /tmp/tv2; hls_fragment 15s; pull rtmp://202.69.69.180:443/webcast/bshdlive-pc; } } }

rtmp就是用nginx搭建流媒体的简单配置,当然这个模块配置是很灵活的,详情见官方wiki文档

server:标识为一个服务

listen:监听端口

chunk_size:流复用块的大小,值越大cpu消耗越低

application:每一个应用的名称,此处不支持正则匹配

live:当on时表示开启实时(相当于直播)

hls:当on时表示开启把一段视频流,分成一个个小的基于HTTP的文件来下载

hls_path:生成的视频slice切片临时目录

hls_fragment:每一个切片的长度

pull:去其他流媒体服务器拉流,相当于nginx http模块中的proxy_pass功能

push:推流到其他流媒体服务器与pull作用相似

因为上面,我已经配置了一个第三方免费rtmp服务器(好像是香港的那边的电视台),如果还未失效的话,启动nginx服务。

打开EvPlayer是可以访问到的

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

右键选择播放网络流:

输入配置nginx中配置rtmp地址,效果如下(不用输密码,直接输入地址即可):

3.2.3使用ffmpeg将本地视屏推送到nginx中搭建的流媒体服务器

我已经将本地下载的视频文件放置到ffmpeg的bin目录,如图:

ffmpeg.exe -re -i movie.mkv -f flv rtmp://192.168.160.10:1935/live cmd 进入bin目录执行,这条命令即可。rtmp地址为对应的nginx中配置的地址

命令说明:(文档地址:http://ffmpeg.org/documentation.html)

-i 设定输入流 -f 设定输出格式 -ss 开始时间 -re 按原始帧率推送 -f 输出流格式类型(flv,mp4等等) -b 设定视频流量(码率),默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器

命令执行效果如下:

打开EVplayer,现在就可以通过nginx搭建的流媒体服务观看直播视频了

3.3rtmp配置说明:Application 创建一个RTMP应用,这里有点区别于http的location Timeout 60s stocket超时,可以配合keepalive和ping值来实现不让服务器端长期处于监听连接客户端状态,实现快速关掉socket Ping 3m ping_timeout 30s RTMP ping用于检查活动连接的协议。发送一个特殊的包远程连接,在ping_timeout指定时间内期待一个回复,如果没有收到回复,连接断开 max_streams 32 设置RTMP流的最大数目,单一流数据最大限制,一般默认的32就可以了 ack_window 5000000 设置RTMP窗口的大小 chunk_size 4096 数据块大小 设置值越大CPU负载就越小 max_queue 最大队列数,一般默认即可 max_message 1M 输入数据消息的最大大小。所有输入数据消息都会保存在内存中,等待完成流媒体转发。在理论上传入的消息可以是非常大,对服务器稳定性影响较大,所以一般默认即可。 out_queue out_cork Buflen 5s 设置默认缓冲区长度。通常客户端发送播放前RTMP set_buflen命令并重置该设置 访问控制 Access Allow/deny 允许来自指定地址或者所有地址发布/播放 Allow public 127.0.0.1 Deny publish all; Allow play 192.168.0.0/24 Deny play all; Exec命令 Exce exec_options on; 启动一些exec指令选项,通过一些exec事件来干预整个RTMP流 可以仔细一些外部编解码功能 Exec ffmpeg -i rtmp://localhost?src/$name -vcodec libx264 -vprofile baseline -g 10 -s 300x200 -acodec libfaac -ar 44100 -ac 1 -f flv rtmp://localhost/hls/$name 2>> /var/log/ffmpeg-$name.log; Exce_statc 类似exce,属于静态命令,不支持传递上下文参数 Exec_kill_signal term; Exec_kill_signal user1; Exec_kill_signal 3; Exec_pull Exec_push Exec_publish 指定与参数外部命令要在发布事件执行。 Exec_play 指定与要在打开事件执行外部命令 Exec_play_done 指定要在打开完成事件执行外部命令 Exec_publish_done Exec_record_done 例子 exec_play bash -c “echo $addr $pageurl >> /tmp/clients” Exec_publish base -c “echo $addr $flashver >> /tmp/publishers” 转录 Exec_record_done ffmpeg -y -i $path -acodec libmp31ame -ar 44100 -ac 1 -vcodec libx264 $dirname/$basename.mp4 Live 模式 Live on 切换直播模式,即一对多广播 Meta on/copy/off 奇幻发送元数据到客户端 默认on Interleave on/off 切换交叉模式。在该模式下,音视频会在同一个RTMPchunk流中传输。默认为off wait_key on|off 使视频流从一个关键帧开始,默认为off wait_video on|off 在一个视频帧发送前禁用音频。默认off 通过wait_key/wait_video进行组合以使客户端可以收到具有所有其他数据的视频关键帧。但这样会增加连接延迟。不过可以通过编解码器中调整关键帧间隔来减少延迟。 Publish_notify on 发送NetStream.Publish.Start和NetStream.Publish.Stop给用户,默认off Drop_idle_publisher 10s 终止指定时间内闲置(没有音频、视频)的发布连接,默认为off。注意这个仅仅对于发布模式的连接起作用(发送publish命令之后) Sync 10ms 同步音视频流。如果用户带宽不足以接收发布率,服务器会丢弃一些帧。这将导致同步问题。当时间戳差超过sync指定值,将会发送一个绝对帧来解决这个问题,默认为300ms Play_restart off 使nginx-rtmp能够在发布启动或者停止时发送NetStream.Play.Start 和 NetStrem.Play.Stop到每个用户。如果关闭的话,那么每个用户就只能在回放的开始结束时收到该通知了。默认为on Record 模式 Record off|all|audio|video|keyframes|manual 切换录制模式,流可以被记录到flv文件 Off 不录制 All 录制音频和视频 Audio Video Keyframes 只录制关键视频帧 Manual 不自动启动录制,使用控制接口来进行启动和停止 Record_path /tmp/rec 指定录制的flv文件存放目录 Record_suffix -%d-%b-%y-%T.flv 录制后缀strftime格式 Record_unique on|off 是否添加时间戳到录制文件,防止文件被覆盖,默认off record_append on|off 切换文件附加模式。开启后,录制时将新数据附加到旧文件后面。默认off record_lock on|off 锁定文件,调用系统的fcntl record_max_size 128K 设置录制文件的最大值 Record_max_frames 2 设置每个录制文件的视频帧最大数量 Record_interval 1s/15m 在这个指令指定的时间之后重启录制。默认off设置为0表示录制中无延迟。如果record_unique为off时所有的记录都会被写到同一个文件中。否则就会以时间戳区分在不同文件 Record_notify on|off 奇幻当定义录制启动或者停止文件时发送NetStream.Record.Start和NetStream.Record.Stop状态信息onStatus到发布者。 应用 Application rtmp{ Live on; Record all; Record_path /var/rec; Recorder audio{ Record audio; Record_suffix .audio.flv; } Recorder chunked{ Record all; Record_interval 15s; Record_path /var/rec/chunked; } } 创建录制块。可以在单个application中创建多个记录 。 VOD媒体 Play dir|http://loc 播放指定目录或者HTTP地址的flv或者mp4文件。注意HTTP播放是要在整个文件下载完后才开始播放。同一个play可以播放多个视频地址(用于负载)。MP4格式要在编解码都被RTMP支持才可以播放。一般常见的就是H264/AAC Application vod{ Play /var/flvs; } Application vod_http{ Play http://localhost/vod; } Play_temp_path /www 设置远程VOD文件完全下载之后复制于play_temp_path之后的路径。空值的话禁用此功能。 Play_local_path dir 在播放前设置远程存储VOD文件路径,默认/tmp Play_local_path /tmp/videos; Paly /tmp/videos http://localhost/videos 表示播放视频,先播放本地缓存,如果没有的话,从localhost/videos下载到本地/tmp/videos后,在进行播放 Relay模式 Pull url [key=value] 创建pull中继。主要是从远程服务器拉取流媒体。并进行重新发布。 Url语法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么将会使用本地application名,如果找不到playpath那么久用当前流名称。 参数如下(使用Key=Value方式) app 明确application名 Name 捆绑到relay的bending流名称。如果为空,那么会使用application中所有本地流 tcUrl pageUrl swfUrl flashVer playPath Live Start Stop Static Pull rtmp://cdn.example.com/main/ch?id=1234 name=channel; Push url [key=value] 与pull类似,只是push推送发布流到远程服务器。 Push_reconnect 1s 在断开连接后,在push重新连接钱等待的时间,默认3秒 Session_relay on; 切换会话relay模式。在这种情况下关闭时relay销毁。 Notify 模式 这个功能主要是提供HTTP回调。当发送一些连接操作是,一个HTTP请求异步发送。命令处理会被暂停挂起,知道它返回结果代码。当HTTP返回2xx成功状态码时,RTMP会话继续。3xx状态码会使RTMP重定向到另一个从HTTP返回头获取到的application,否则连接丢失。其他状态码,连接断开。目前用来做简单的鉴权。 On_connect url 设置HTTP连接回调。当客户分发连接命令时。 例子: On_connect http://localhost/my_auth; Location /on_connect{ If($arg_flashver != “my_secret_flashver”){ Rewrite ^.*$ fallback?permanent; } } On_play url 设置HTTP播放回调。分发客户分发播放命令时。 http { Location /redirect { Rewrite ^.*$ newname?permanent; } } Rtmp{ Application myqpp{ Live on; On_play http://localhost/redirect; } } On_publish On_doone On_play_done On_publish_done On_record_done On_update Notify_update_timeout 设置on_update回调时间 Notify_update_strict on|off Notify_relay_redirect on Notify_method get 设置HTTP方法通知,默认是application/x-www-form-urlencodeed 的POST内容类型。有时候可能会需要GET方法,在nginx的http{}部分处理调用。在这种情况下可以使用arg_*变量去访问参数。 例如如果是method为get时 Location /on_play{ If($arg_pageUrl ~* localhost){ Return 200; } Return 500; } HLS 模式 Hls on|off 使application 切换HLS协议直播 Hls_path /tmp/hls; 设置HLS播放列表和分段目录。这一目录必须在nginx启动前就已经存在。 Hls_fragment 15s; 设置HLS分段长度,默认5秒,这个跟直播延迟有比较大的影响 Hls_playlist_length 20m; 设置HLS播放列表长度,默认30秒。这个跟直播缓存有关。 Hls_sync time 设置HLS时间戳同步阈值。默认2ms。这个功能防止由低分辨率RTMP(1KHz)转换到高分辨率MPEG-TS(90KHz)之后出现的噪音。 Hls_continuous on|off 切换HLS连续模式,默认off。 Hls_nested on|off 切换HLS嵌套模式。默认off。 Hls_cleanup on|off; 切换HLS清理。默认on AccessLog日志 Access_log off|path [format_name] Log_format new_format ‘$remote_addr’; Access_log logs/rtmp_access.log new_format; Log_format 指定日志格式 创建指定的日志格式。日志格式看起来很像 nginx HTTP 日志格式。日志格式里支持的几个变量有: * connection - 连接数。 * remote_addr - 客户端地址。 * app - application 名。 * name - 上一个流名。 * args - 上一个流播放/发布参数。 * flashver - 客户端 flash 版本。 * swfurl - 客户端 swf url。 * tcurl - 客户端 tcUrl。 * pageurl - 客户端页面 url。 * command - 客户端发送的播放/发布命令:NONE、PLAY、PUBLISH、PLAY+PUBLISH。 * bytes_sent - 发送到客户端的字节数。 * bytes_received - 从客户端接收到的字节数。 * time_local - 客户端连接结束的本地时间。 * session_time - 持续连接的秒数。 * session_readable_time - 在可读格式下的持续时间。 默认的日志格式叫做 combined。这里是这一格式的定义: $remote_addr [$time_local] $command "$app" "$name" "$args" - $bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time) Limits限制 max_connections number; 设置rtmp引擎最大连接数,默认off Application hls{ Live on; Hls on; Hls_path /tmp/hls; Hls_fragment 15s; }

原文链接:https://blog.csdn.net/XuHang666/article/details/103290810



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3