Mac 搭建 nginx+rtmp 推流服务器

直播协议选择

国内常见公开的直播协议有几个:RTMP、HLS、HDL(HTTP-FLV)、RTP,我们来逐一介绍。

RTMP协议:

是Adobe的专利协议,现在大部分国外的CDN已不支持。在国内流行度很高。原因有几个方面:

1、开源软件和开源库的支持稳定完整。如斗鱼主播常用的OBS软件,开源的librtmp库,服务端有nginx-rtmp插件。

2、播放端安装率高。只要浏览器支持FlashPlayer就能非常简易的播放RTMP的直播,协议详解可以Google了解。相对其他协议而言,RTMP协议初次建立连接的时候握手过程过于复杂(底层基于TCP,这里说的是RTMP协议本身的交互),视不同的网络状况会带来给首开带来100ms以上的延迟。基于RTMP的直播一般内容延迟在2~5秒。

1

HTTP-FLV 协议:

即使用HTTP协议流式的传输媒体内容。相对于RTMP,HTTP更简单和广为人知,而且不担心被Adobe的专利绑架。内容延迟同样可以做到2~5秒,打开速度更快,因为HTTP本身没有复杂的状态交互。所以从延迟角度来看,HTTP-FLV要优于RTMP。

HLS 协议:

即Http Live Streaming,是由苹果提出基于HTTP的流媒体传输协议。HLS有一个非常大的优点:HTML5可以直接打开播放;这个意味着可以把一个直播链接通过微信等转发分享,不需要安装任何独立的APP,有浏览器即可,所以流行度很高。社交直播APP,HLS可以说是刚需,下来我们分析下其原理 。

基于HLS的直播流URL是一个m3u8的文件,里面包含了最近若干个小视频TS(一种视频封装格式,这里就不扩展介绍)文件,如 http://www.ucloud.cn/helloworld.m3u8 是一个直播留链接,其内容如下:

2

假设列表里面的包含5个TS文件,每个TS文件包含5秒的视频内容,那么整体的延迟就是25秒。当然可以缩短列表的长度和单个TS文件的大小来降低延迟,极致来说可以缩减列表长度为1,1秒内容的m3u8文件,但是极易受网络波动影响造成卡顿。

通过公网的验证,目前按同城网络可以做到比较好的效果是5~7秒的延迟,也是综合流畅度和内容延迟的结果。那么HTML5是否可以有更低延迟直接打开的直播流技术呢? 我们在最后会探讨这个问题。

RTP 协议:

即Real-time Transport Protocol,用于Internet上针对多媒体数据流的一种传输层协议。

实际应用场景下经常需要RTCP(RTP Control Protocol)配合来使用,可以简单理解为RTCP传输交互控制的信令,RTP传输实际的媒体数据。

RTP在视频监控、视频会议、IP电话上有广泛的应用,因为视频会议、IP电话的一个重要的使用体验:内容实时性强。

对比与上述3种或实际是2种协议,RTP和它们有一个重要的区别就是默认是使用UDP协议来传输数据,而RTMP和HTTP是基于TCP协议传输。为什么UDP 能做到如此实时的效果呢?关于TCP和UDP差别的分析文章一搜一大把,这里不在赘述,简单概括:

UDP:单个数据报,不用建立连接,简单,不可靠,会丢包,会乱序;

TCP:流式,需要建立连接,复杂,可靠** ,有序。**

实时音视频流的场景不需要可靠保障,因此也不需要有重传的机制,实时的看到图像声音,网络抖动时丢了一些内容,画面模糊和花屏,完全不重要。TCP为了重传会造成延迟与不同步,如某一截内容因为重传,导致1秒以后才到,那么整个对话就延迟了1秒,随着网络抖动,延迟还会增加成2秒、3秒,如果客户端播放是不加以处理将严重影响直播的体验。

总结一下:在直播协议的选择中,如果选择是RTMP或HTTP-FLV则意味着有2~5秒的内容延迟,但是就打开延迟开,HTTP-FLV 要优于RTMP。HLS则有5~7秒的内容延迟。选择RTP进行直播则可以做到1秒内的直播延迟。但就目前所了解,各大CDN厂商没有支持基于RTP直播的,所以目前国内主流还是RTMP或HTTP-FLV。

环境

Homebrew 安装

确认是否已经安装:

1
man brow

如果出现下面的代码,证明已经安装过:

1
2
3
4
5
6
NAME  
brew - The missing package manager for macOS

SYNOPSIS
brew --version
brew command [--verbose|-v] [options] [formula] ...

安装命令:

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果已经安装过,而想要卸载:

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

如果不想重装,升级一下brow

1
brew update

安装 nginx

执行克隆命令,github 的项目(https://github.com/denji/homebrew-nginx)

1
brew tap denji/nginx

注意brew tap homebrew/nginx报下面的错误,homebrew/nginx已经启用.

报错:Error: homebrew/nginx was deprecated. This tap is now empty as all its formulae were migrated.

执行安装命令:

1
brew install nginx-full --with-rtmp-module

至此nginx和rtmp模块就安装好了,下面开始来配置nginx的rtmp模块

接下来看一下nginx安装在什么地方

1
brew info nginx-full

nginx安装所在位置

1
/usr/local/opt/nginx-full/bin/nginx

nginx配置文件所在位置

1
/usr/local/etc/nginx/nginx.conf

运行 NGINX

启动nginx,执行命令:

1
nginx

浏览器地址栏输入:http://localhost:8080

img

出现以上界面,说明安装成功.

如果终端上提示

1
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)

则表示8080端口被占用了, 查看端口PID

1
lsof -i tcp:8080

kill掉占用8080端口的PID

1
kill 9663(这里替换成占用8080端口的PID)

重新执行nginx…

nginx常用方法:

重新加载配置文件:

1
nginx -s reload

重新加载日志:

1
nginx -s reopen

停止 nginx:

1
nginx -s stop

有序退出 nginx:

1
nginx -s quit

配置 RTMP

修改nginx.conf这个配置文件,配置rtmp

复制nginx配置文件所在位置:

1
vi /usr/local/etc/nginx/nginx.conf

执行上面命令直接编辑,或者直接前往当前文件用记事本打开.

1
2
3
http {  
​ ……
}

在http节点后面加上rtmp配置

1
2
3
4
5
6
7
8
9
rtmp {  
server {
listen 2016;
application rtmplive {
live on;
record off;
}
}
}

编辑完成之后,执行一下重新加载配置文件命令:

1
nginx -s reload

重启nginx:

1
sudo /usr/local/opt/nginx-full/bin/nginx -s reload

安装 FFmpeg 工具

注:ffmepg转码工具

1
brew install ffmpeg

安装完成之后

安装一个支持rtmp协议的视频播放器,Mac下可以用VLC

本地下载一个视频文件路径为 /Users/yuhanle/Downloads/test.mp4

执行以下命令

1
ffmpeg -re -i /Users/yuhanle/Downloads/test.mp4 -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:2016/rtmplive/room

然后打开 VLC 中 的 file – Open Network, 直接输入代码中的 url:

1
rtmp://localhost:2016/rtmplive/room

然后进行播放

FFmpeg 推流

1、桌面录制或者分享

1
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:2016/rtmplive/room

2、桌面+麦克风

1
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:2016/rtmplive/room

3、桌面+麦克风,并且还要摄像头拍摄到自己

1
ffmpeg -f avfoundation -framerate 30 -i "1:0" \-f avfoundation -framerate 30 -video_size 640x480 -i "0" \-c:v libx264 -preset ultrafast \-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:2016/rtmplive/room

LFLiveKit

LaiFeng IOS Live Kit,H264 and AAC Hard coding,support GPUImage Beauty, rtmp transmission,weak network lost frame,Dynamic switching rate

通过集成 LFLiveKit,我们可以使用手机录制并推送至直播间地址,然后使用播放端直接播放视频。

参考资料

关于直播,所有的技术细节都在这里了(二)
关于直播,所有的技术细节都在这里了(一)
Mac 搭建 nginx+rtmp 服务器-带你出坑
在Mac系统上搭建iOS手机推流服务器相关总结
Mac搭建nginx+rtmp服务器 推流

请我喝杯咖啡吧~