Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nginx搭建本地流媒体服务器 #179

Open
itgoyo opened this issue Aug 13, 2019 · 0 comments
Open

nginx搭建本地流媒体服务器 #179

itgoyo opened this issue Aug 13, 2019 · 0 comments

Comments

@itgoyo
Copy link
Owner

itgoyo commented Aug 13, 2019

几个名词的解释

CDN:
    CDN全称:Content Delivery Network或Content Ddistribute Network,
    即内容分发网络基本思路:尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,
    使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,
    CDN系统能够实时地根据网络流量和各节点的连接、
    负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
    目前国内最大的CDN服务商应该是网宿

Nginx:
    Nginx是一款轻量级服务器/反向代理服务器及电子邮件代理服务器,并在一个BSD-like 协议下发行。
    其特点是占有内存少,并发能力强。

RTMP:
    RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间
    音频、视频和数据传输 开发的开放协议。.这个协议建立在TCP协议或者轮询HTTP协议之上,是一个协议族,
    包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种
    它有多种变种:
    1)RTMP工作在TCP之上,默认使用端口1935;
    2)RTMPE在RTMP的基础上增加了加密功能;
    3)RTMPT封装在 HTTP请求之上,可穿透 防火墙;
    4)RTMPS类似RTMPT,增加了TLS/SSL的安全功能;

ijkplayer:
    因为 iOS 自带的 AVplayer 不支持 rtmp 格式的视频流播放,所以我们需要使用第三方库。
    GitHub 中开源又常见的 rtmp 流播放器中,较为成熟的是 bilibili 开源的 ijkplayer
    它基于 ffmpeg,支持 Android 和 iOS,视频流和本地视频的播放都很强大

ffmpeg:
    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
    项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。

H.264:

    H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,
    是MPEG-4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,
    而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1。
    ## H264是一种高压缩率的编码标准,如何压缩嘞?一般的视频采集都是25帧/秒,
    ## 也就是每秒截图25次,其实每一张图片的内容都相差不大,压缩的办法就是利用算法,
    ## 只将每张图片变动差异化的部分保存下来,这样视频文件就小多了

    低码率(Low Bit Rate)对H.264的高的压缩比起到了重要的作用,和MPEG-2和MPEG-4 ASP等压缩技术相比,
    H.264压缩技术将大大节省用户的下载时间和数据流量收费。
    尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,
    正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。

    H.265是新的编码协议,也即是H.264的升级版。
    他们核心区别的可以分两步看:
    1同样的画质和同样的码率,H.265比H2.64 占用的存储空间要少理论50%。
    2如果存储空间一样大,那么意味着,在一样的码率下H.265会比H2.64 画质要高一些理论值是30%~40%
    据说能节省一半带宽,但需要机器更强的运算能力。

FFmpeg和h.264是什么关系?
     H.264是标准(包含编码、解码),x264是标准的实现(只实现了编码),ffmpeg是一个框架,
     但是里面包含了H.264的解码实现,所以ffmpeg + x264 就包含了H.264的编码、解码的实现了。

mac搭建naginx+rtmp服务器

原想用mac中自带的Apache搭建,但是naginx是轻量级的,同样起web 服务,也比apache 占用更少的内存及资源,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能,用它来做hls或者rtmp流媒体服务器是非常不错的选择.

一、使用Homebrow安装 nginx

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

 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.

(2)执行安装命令:

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

至此nginx和rtmp模块就安装好了,下面开始来配置nginx的rtmp模块
接下来看一下nginx安装在什么地方

brew info nginx-full  

nginx安装所在位置:

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

nginx配置文件所在位置:

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

(3)启动nginx,执行命令:

sudo  nginx

二、测试:

在浏览器中打开如下地址:http://localhost:8080

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

如果终端上提示

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

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

lsof -i tcp:8080  

kill掉占用8080端口的PID

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

三.重新加载nginx的配置文件

(1)修改nginx.conf这个配置文件,配置rtmp
复制nginx配置文件所在位置:

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

(2)执行上面命令会直接编辑,或者直接前往当前文件用记事本打开.
滚动到最后面(最后一个}后面即可,不能在{}里面),添加一下代码,进行配置,最后记得保存。

rtmp {  
  server {  
      listen 1935;  
    #直播流配置  
      application rtmplive {  
          live on;  
          #为 rtmp 引擎设置最大连接数。默认为 off  
          max_connections 1024;  
       }  
      application hls{  
          live on;  
          hls on;  
          hls_path /usr/local/var/www/hls;  
          hls_fragment 1s;  
      }  
   }  
}  

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

 sudo nginx -s reload

需要输入开机密码 sudo不加的话会报错: nginx: [alert] could not open error log file: open() "/usr/local/var/log/nginx/error.log" failed (13: Permission denied)

该命令执行后会出来一个弹框询问是否允许 nginx 加入到网络中,选择允许即可。

(4)重启nginx:

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

PS:如果你之前不是按照我上面的方法按照的 nginx,在执行 sudo nginx -s reload 时报了如下错,建议你卸载 nginx后按照我上面的步骤重新安装nginx。
nginx: [emerg] unknown directive "rtmp" in /usr/local/etc/nginx/nginx.conf:119

nginx常用方法:

重新加载配置文件:  nginx -s reload
重新加载日志:     nginx -s reopen 
停止 nginx:      nginx -s stop  
有序退出 nginx:   nginx -s quit  

出现权限不足的错误提示时,命令前加上 sudo

四、安装ffmepg工具

brew install ffmpeg

上图表示ffmepg安装完成

五、本地推流

(1)、搭建本地视频直播,比如电脑上面有很多电影,我们可以通过推流的形式实现实时直播:

A:在电脑上播放推流内容
安装一个支持rtmp协议的视频播放器,Mac下可以用VLC
下载VLC
本地下载一个视频文件路径为 /Users/iOS002/Desktop/loginmovie.mp4
执行以下命令

ffmpeg -re -i /Users/iOS002/Desktop/loginmovie.mp4  -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/rtmplive/room

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

rtmp://localhost:1935/rtmplive/room

即可以通过VLC来播放终端中实时推过来的 RTMP流。

效果如图

B:通过手机观看电脑的推流
通过集成 ijkplayer 把地址换成推流的地址即可观看:
播放端用的针对RTMP优化过的ijkplayer,ijkplayer是基于FFmpeg的跨平台播放器,这个开源项目已经被多个 App 使用,其中映客、美拍和斗鱼使用了 ijkplayer

(2)、桌面录制或者分享

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

(3)、桌面+麦克风

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

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

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 集成到工程进行推流,LFLiveKit已经帮我们实现了视频采集、后台录制、美颜功能、支持h264、AAC编码,动态改变速率,RTMP传输等,我们开发的时候就很简单了只需把localhost:8080换成自己电脑的ip地址即可:

 rtmp://10.0.0.17:1935/rtmplive/room

注意通过网络查看电脑的局域网 IP替换掉 localhost 即可。

A:通过VLC观看手机的推流
打开手机直播后,然后在电脑上打开VLC(同上),就能实现手机推流,在电脑上拉流播放了!!(注:手机需要和电脑连接同一网络!)

B:通过手机观看手机的推流(这也就是市面上的那些直播App的最终实现形式了)
通过集成 ijkplayer 把地址换成推流的地址即可观看。

PS:一个很隐蔽的报错:

如果你发现你的推流地址和拉流地址在电脑上都是好好的,但是通过手机实现的时候就是报错,那么估计就是因为Mac防火墙的问题。

ERROR: PILI_RTMP_Connect0, failed to connect socket. 60 (Operation timed out)
ERROR: WriteN, PILI_RTMP send error 9, Bad file descriptor, (140 bytes)
ERROR: PILI_RTMP_Connect0, failed to connect socket. 60 (Operation timed out)
ERROR: WriteN, PILI_RTMP send error 9, Bad file descriptor, (140 bytes)

关闭 Mac 的防火墙即可解决问题。


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant