推流服务器搭建实战
推流服务器搭建实战
前不久iriszero师傅写了一键乳糖莓片(RTMP)的Docker脚本
FROM ubuntu
MAINTAINER iriszero48 version: 0.1
RUN sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list && \
sed -i "s/security.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list
RUN apt-get update && apt-get -y install nginx libnginx-mod-rtmp
EXPOSE 1935
RUN echo "rtmp{server{listen 1935;chunk_size 4096;application live {live on;}}}" >> /etc/nginx/nginx.conf
CMD service nginx start && bash
https://github.com/iriszero48/Trash/blob/master/ubuntu18.04%20rtmp/Dockerfile
iriszero师傅比较偷懒,直接包管理libnginx-mod-rtmp,莫的感情。
今天我还是手动一下试一下,正常情0况下,我都是用宝塔管理,但是宝塔面板并不支持RTMP模块的安装。
首先去VULTR开一台机器并安装好宝塔
进入宝塔界面后我们选择安装LNMP,由于我们是基于Nginx的推流,所以就只安装Nginx就好了。
在安装的同时我们做一下准备工作,我们需要安装的模块是国人开发的nginx-http-flv-module ,可以说是nginx-rtmp-module的升级,我觉得还行。
我们首先先创建一个站点,这里为了方便测试,就直接用IP访问,当网站创建好后,可以看到创建成功的页面,那么说明Nginx就安装好了,下一步我们来安装模块。
首先把模块下载下来并解压到 /opt/nginx-http-flv-module
我们在根目录下执行 /www/server/nginx/sbin/nginx -V
将./configure arguents:之后的内容复制到记事本备用
宝塔面板安装的nginx源码位于/www/server/nginx/src
所以我们编译内容为(./configure 上一步记事本中的备用内容 --add-module=/opt/nginx-http-flv-module)
./configure --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --add-module=/opt/nginx-http-flv-module
切换到/www/server/nginx/src
目录并执行上面的代码,整个过程很快就能完成,当出现下面这些的时候,就可以继续下一步了。
再执行make
,千万不要执行make install
切记切记!
make完成后将系统中原有的nginx用重新编译生成的nginx文件替换,替换后重启nginx使新编译nginx生效
rm -rf /www/server/nginx/sbin/nginx
cp objs/nginx /www/server/nginx/sbin/
service nginx restart
至此我们就得到了一个推流服务器了,但不到我们还需要小小地配置一下才能使用。
根据官方给出的nginx配置和自己的需求改一下配置然后重启一下就行了。
worker_processes 1; #运行在Windows上时,设置为1,因为Windows不支持Unix domain socket
#worker_processes auto; #1.3.8和1.2.5以及之后的版本
#worker_cpu_affinity 0001 0010 0100 1000; #只能用于FreeBSD和Linux
#worker_cpu_affinity auto; #1.9.10以及之后的版本
error_log logs/error.log error;
#如果此模块被编译为动态模块并且要使用与RTMP相关的功
#能时,必须指定下面的配置项并且它必须位于events配置
#项之前,否则NGINX启动时不会加载此模块或者加载失败
#load_module modules/ngx_http_flv_live_module.so;
events {
worker_connections 4096;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 80;
location / {
root /var/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /live {
flv_live on; #打开HTTP播放FLV直播流功能
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头
add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP头
}
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header 'Cache-Control' 'no-cache';
}
location /dash {
root /tmp;
add_header 'Cache-Control' 'no-cache';
}
location /stat {
#push和pull状态的配置
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/rtmp; #指定stat.xsl的位置
}
#如果需要JSON风格的stat, 不用指定stat.xsl
#但是需要指定一个新的配置项rtmp_stat_format
#location /stat {
# rtmp_stat all;
# rtmp_stat_format json;
#}
location /control {
rtmp_control all; #rtmp控制模块的配置
}
}
}
rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /tmp;
rtmp {
out_queue 4096;
out_cork 8;
max_streams 128;
timeout 15s;
drop_idle_publisher 15s;
log_interval 5s; #log模块在access.log中记录日志的间隔时间,对调试非常有用
log_size 1m; #log模块用来记录日志的缓冲区大小
server {
listen 1935;
server_name www.test.*; #用于虚拟主机名后缀通配
application myapp {
live on;
gop_cache on; #打开GOP缓存,减少首屏等待时间
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
application dash {
live on;
dash on;
dash_path /tmp/dash;
}
}
server {
listen 1935;
server_name *.test.com; #用于虚拟主机名前缀通配
application myapp {
live on;
gop_cache on; #打开GOP缓存,减少首屏等待时间
}
}
server {
listen 1935;
server_name www.test.com; #用于虚拟主机名完全匹配
application myapp {
live on;
gop_cache on; #打开GOP缓存,减少首屏等待时间
}
}
}
那么我们的推流地址就是 rtmp://66.42.38.183/myapp/streamname
记得去宝塔的安全里面 开放一下1935端口!切记!不然会推不上。
然后用ffmpeg测试推流
ffmpeg -re -i atm.mp4 -c copy -f flv rtmp://66.42.38.183/myapp/streamname
你就得到了一个循环播放的迪迦奥特曼2333
总结
牛逼RTMP,垃圾Flash!
补充
由于RTMP是基于AdobeFlash那套的东西,所以播放起来比较恶心。
如果一定要使用swf播放的话,文件在这:http://url.cn/56d1uTj
但是中国人民的智慧是伟大的
<html>
<head>
<title>视频直播</title>
<meta charset="utf-8">
<link href="http://vjs.zencdn.net/5.5.3/video-js.css" rel="stylesheet">
<!-- If you'd like to support IE8 -->
<script src="http://vjs.zencdn.net/ie8/1.1.1/videojs-ie8.min.js"></script>
</head>
<body>
<h1>直播间</h1>
<video id="my-video" class="video-js" controls preload="auto" width="640" height="300"
poster="https://pic.gksec.com/2020/02/13/a2942ea2ade0b/timg.jpg" data-setup="{}">
<source src="rtmp://66.42.38.183/myapp/streamname" type="rtmp/flv">
<!-- 如果上面的rtmp流无法播放,就播放hls流 -->
<!-- <source src="http://10.10.5.119/live/livestream.m3u8" type='application/x-mpegURL'> -->
<p class="vjs-no-js">播放视频需要启用 JavaScript,推荐使用支持HTML5的浏览器访问。
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
</p>
</video>
<script src="http://vjs.zencdn.net/5.5.3/video.js"></script>
</body>
</html>
相较于Flash来说还是js更香啊。
当然,最好就是不用rtmp来播放,尽量使用http来播放,经过测试这样的速度会快很多,这里用到了bilibili的开源项目flv.js。
<script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.js"></script>
<video id="videoElement"></video>
<script>
if (flvjs.isSupported()) {
var videoElement = document.getElementById('videoElement');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: 'http://66.42.38.183/live?port=1935&app=myapp&stream=streamname'
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
</script>