流媒体服务器,给你好看
流媒体服务器,给你好看
花满楼原创
花满楼:我的D盘有部大电影,你想看吗?
小白:想!拿u盘来拷?
花满楼:太low了,点播给你看就行啦。
小白:点播是什么?
点播,就是把录制编码好的东西分发一下。
直播,就是边录制边播放。
点播与直播的概念,更多是从流媒体服务器的角度来说的。点播类似于客户端播放本地的文件(即回放,playback),可以拖拉进度。而直播则是实时的,没有进度可拖拉。
小白:流媒体是什么?
花满楼:媒体就是声音、图像、文字这些元素,当这些元素以流协议传输时就叫流媒体。流协议后续再介绍。
本文解决一个问题:搭建一个点播或直播的服务器。
小白:服务器是什么?
花满楼:服务器就是一个程序啰,当然了,全世界都是程序来的!
小白:……那我怎么写这个服务器程序呢?
花满楼:这次介绍的还是整车体验,不需要你写代码,你只需要做一些安装与配置的工作。
搭建一个建全而强大的流媒体服务器是有难度与工作量的,但弄一个原型(支持点播与直播)来玩玩还是可以的。
小白:那有什么现成的流媒体服务器程序?
花满楼:这次介绍的是 nginx。
小白:nginx有什么特点?
nginx是一个http服务器,但通过扩展(加入rtmp模块等),可以变身为流媒体服务器,并且支持rtmp与hls。
小白:rtmp与hls是什么东东?
花满楼:暂且知道是流协议,就是一个传输约定即可,有机会我们再交手。这里的介绍会涉及rtmp库的使用。
(一)安装nginx
以编译nginx源码的方式来安装nginx。
需要下载nginx源码、nginx使用的rtmp模块、以及rtmp使用的openssl模块(可以不使用)。下载后,最终的目录结构是这样的:
小白:哇,好大一坨!
花满楼:看重点!
具体操作
nginx-rtmp-module源码下载:
git clone https://github.com/arut/nginx-rtmp-module.git。
openssl源码下载:
git clone https://github.com/openssl/openssl.git
到nginx官网下载最新版本的nginx源码:
http://nginx.org/en/download.html
如果之前用brew安装过nginx,那要先卸载:sudo brew uninstall nginx,因为要支持rtmp,须通过源码来编译安装。
编译安装nginx:
cd nginx-1.11.13/
./configure --add-module=../nginx-rtmp-module --with-openssl=../openssl
make
sudo make install
最终的安装目录应该是/usr/local/nginx/sbin/,
在~/.bash_profile中指定搜索路径:export PATH="${PATH}:/usr/local/nginx/sbin/"
查看配置文件路径等信息:
nginx -h
启动:
sudo nginx
如果有提示端口已经被占用,那可能已经启动了,可以重新启动:
sudo nginx -s reload
测试:
curl 127.0.0.1
或者浏览器访问localhost:8080,
能看到welcome信息即表示安装成功而且已经运行,占用8080端口。
小白:look!经过重重磨难,终于看到welcome了:
(二)实现点播
只需要改下配置,让nginx关联一个本地的文件即可。
具体操作
查看配置文件的路径:
nginx -h
配置文件为/usr/local/nginx/conf/nginx.conf,
也可以通过nginx -c来指定一个新的配置文件。
在配置文件中,增加rtmp项:
rtmp {
server {
listen 1935; # port
chunk_size 4096; # data chunk size
application playback {
play /opt/show; # target file path
}
}
}
1935为端口,chunk_size为块大小。
playback为应用的名称,可以任意改。
play为关键字,不能改。
play对应的值为本地文件所在目录,要播放的文件放在这个目录内。
配置完毕后,重启nginx:
sudo nginx -s reload
测试,使用ffplay来播放nginx服务器的点播:
ffplay rtmp://localhost/playback/Movie-1.mp4
Movie-1.mp4是放在目录/opt/show/下面的文件。
小白:明白了!你把想放映的大电影放到那个目录下面,再给我一个rtmp的地址,我就可以用ffplay来播放了!我终于不用拷贝电影了!
花满楼:实际使用时,还要考虑网络问题,这里只是示例而已。关于网络的问题,找西门吹雪的文章吧。
小白:西门吹雪?N年没见过他了,他是不是被天外飞仙KO了?
花满楼:……
(三)实现直播
同样修改一下配置,就可以支持直播。
具体操作
在配置文件的rtmp项中,增加“直播”设置:
rtmp {
server {
listen 1935; # port
chunk_size 4096; # data chunk size
application playback {
play /opt/show; # target file path
}
application rtmpdemo {
live on;
}
}
}
rtmpdemo是应用名称,可以随意改。
重启:
sudo nginx -s reload
用ffmpeg来模拟实现推流:
sudo ffmpeg -re -i Movie-1.mp4 -vcodec copy -f flv rtmp://localhost/rtmpdemo/test1
-re 表示按帧率来推;
-f 为推送时封装的格式,对于rtmp都应该使用flv。
拉流播放:
ffplay "rtmp://localhost/rtmpdemo/test1 live=1"
小白:这个直播,实际是本地的一个文件啊?
花满楼:说了是模拟嘛。你可以结合我这之前介绍的“摄像头启动,开始监控”,把录制到的内容用ffmpeg推给nginx,那就是真正的直播了。
小白:直播的实现就这么简单?
花满楼:直播的主线是简单的,难点分落在服务器与客户端,服务器如何高性能,客户端如何实时(与协议选择、服务器分布也有关)并处理好声画质量的问题,等等,这些才是难点。对于这些知识点的深入理解,还是一点一点介绍吧。
小白:好吧,我还是简单用用nginx好了。
开心时间
a:你说我这穷日子过到啥时侯是个头啊?
b:那得看你能活多久了。
包大人对展昭说:“一会儿看我脸色行事。”
展昭:“你tm在逗我吧”
今天客户来银行取钱,坐下一句话说的我石化了:“你好,我死期到了。”
我一个人要乘出租车,司机问我: 你们两个要去哪里?