ubuntu18流媒体服务器搭建
搭建流媒体服务器
NGINX的流媒体插件 nginx-rtmp-module
战斗民族俄罗斯人民开发的一款NGINX的流媒体插件,除了直播发布音视频流之外具备流媒体服务器的常见功能 比如推拉流媒体资源 基于HTTP的FLV/MP4 VOD点播 HLS (HTTP Live Streaming) M3U8的支持 基于http的操作(发布、播放、录制) 可以很好的协同现有的流…
更多nginx-rtmp-module信息 :http://www.oschina.net/p/nginx-rtmp-module
安装Nginx和nginx-rtmp-module
sudo apt-get update # 更新软件源 sudo apt-get upgrade sudo apt-get install nginx # 安装Nginx sudo apt-get install libnginx-mod-rtmp # 安装libnginx-mod-rtmp sudo apt-get install vlc # 流媒体播放器,window和linux都可用 sudo apt-get install obs-studio # 推流拉流工具
nginx常用操作
sudo service nginx reload #不重启重新载入最新配置文件内容 sudo service nginx stop #停止服务 sudo service nginx restart #重启服务
安装ffmpeg
sudo apt install ffmpeg
测试流媒体服务器
# 推流到流媒体服务器 ffmpeg -re -i "video.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://localhost:1935/live/test # 从流媒体服务器中拉流 ffplay "rtmp://localhost:1935/live/test live=1"
Nginx配置预览
修改完配置文件后需要进行reload重载 sudo vi /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf; # 包含模块,不加的话会有:unknown directive "rtmp" in /etc/nginx/nginx.conf
events {
worker_connections 768;
# multi_accept on;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application vod { # 点播配置
play /opt/video/vod;
}
application live { # 直播配置
live on;
hls on; #这个参数把直播服务器改造成实时回放服务器。
wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。
hls_path /opt/video/live; #切片视频文件存放位置。
hls_fragment 10s; #每个视频切片的时长。
hls_playlist_length 60s; #总共可以回看的事件,这里设置的是1分钟。
hls_continuous on; #连续模式。
hls_cleanup on; #对多余的切片进行删除。
hls_nested on; #嵌套模式。
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location /live { # 回放配置,需在直播配置的基础上
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /home/ztf/Videos;
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *; # 一定要加,不加后面视频播放就会显示跨域
}
}
}
点播
sudo vi /etc/nginx/nginx.conf ,修改完配置文件后需要进行reload重载
worker_processes 1;
include /etc/nginx/modules-enabled/*.conf; # 包含模块,不加的话会有:rtmpunknown directive "rtmp" in /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application vod {
play /opt/video/vod;
}
}
}
配置目录/opt/video/vod为存放视频文件的位置了,那我们就往里面放一个文件吧。我放了一个video.mp4文件。打开视频播放软件选用的是VLC media-> open network stream…. ,如图填写我们要点播的节目地址rtmp://localhost/vod/video.mp4 如图
点击play就可以播放了。当然点播不使用RTMP插件nginx自身也是可以实现点播服务的。那就是配置location部分,由于下面我们要配置直播和回看功能所以选用了RTMP服务。
直播
本次测试:
1、OBS推流到流媒体服务器
2、VLC播放
sudo vi /etc/nginx/nginx.conf ,修改完配置文件后需要进行reload重载
worker_processes 1;
include /etc/nginx/modules-enabled/*.conf; # 包含模块,不加的话会有:rtmpunknown directive "rtmp" in /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
hls on; #这个参数把直播服务器改造成实时回放服务器。
wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。
hls_path /opt/video/live; #切片视频文件存放位置。
hls_fragment 10s; #每个视频切片的时长。
hls_playlist_length 60s; #总共可以回看的事件,这里设置的是1分钟。
hls_continuous on; #连续模式。
hls_cleanup on; #对多余的切片进行删除。
hls_nested on; #嵌套模式。
}
}
}
使用OBS(Open Broadcaster Software)推流
添加媒体源:+ –> media source –> OK
设置输出流:输出到指定URL
Controls–>Start Recording,开始推流后,/opt/video/live目录下会生成以下文件。
使用VLC播放
历史回放
本次测试
1、OBS推流到流媒体服务器,如地址:rtmp://localhost/live/test,则/opt/video/live/test会出现index.m3u8文件,index.m3u8文件仅仅是目录。
2、使用VLC回放,播放地址“http://localhost/live/test/index.m3u8”。
我们想一想如果直播服务能够把节目录制在本地,我们不就可以直接进行回看先前的节目了吗?回看一分钟、一小时甚至一天的。nginx的配置:
worker_processes 1;
include /etc/nginx/modules-enabled/*.conf; # 包含模块,不加的话会有:rtmpunknown directive "rtmp" in /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
hls on; #这个参数把直播服务器改造成实时回放服务器。
wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。
hls_path /opt/video/live; #切片视频文件存放位置。
hls_fragment 10s; #每个视频切片的时长。
hls_playlist_length 60s; #总共可以回看的事件,这里设置的是1分钟。
hls_continuous on; #连续模式。
hls_cleanup on; #对多余的切片进行删除。
hls_nested on; #嵌套模式。
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location /live { #这里也是需要添加的字段。
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /opt/video/live;
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *; # 一定要加,不加后面视频播放就会显示跨域
}
}
}
海康摄像头测试
1、从摄像头拉流,并推流到流媒体服务器
2、通过浏览器观看摄像头监控
rtsp 转 rtmp 推流
ffmpeg -i "rtsp://admin:superton128@192.168.1.197:554/h264/ch1/main/av_stream?videoCodecType=H.264" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://192.168.1.54:1935/live/test
rtsp 转 hls 推流
ffmpeg -i "rtsp://admin:superton128@192.168.2.176:554/h264/ch1/main/av_stream?videoCodecType=H.264" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://localhost:1935/live/test
demo
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title>Player</title> <link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet"> </head> <body> <video id="video" class="video-js vjs-default-skin" controls autoplay="autoplay" width="640" height="320" data-setup=\'{}\'> <source src="http://192.168.1.54/live/test/index.m3u8" type="application/x-mpegURL" /> </video> <script src="https://unpkg.com/video.js/dist/video.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/5.12.1/videojs-contrib-hls.min.js"></script> </body> </html>
火狐浏览器测试
问题集
root@ubuntu:~$ sudo service nginx reload
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
root@ubuntu:~$ journalctl -xe
— Unit nginx.service has begun reloading its configuration
Jul 23 18:33:57 ubuntu nginx[24772]: nginx: [emerg] unknown directive “rtmp” in /etc/nginx/nginx.conf:8
Jul 23 18:33:57 ubuntu systemd[1]: nginx.service: Control process exited, code=exited status=1
Jul 23 18:33:57 ubuntu systemd[1]: Reload failed for A high performance web server and a reverse proxy server.
— Subject: Unit nginx.service has finished reloading its configuration
解决方式:/etc/nginx/nginx.conf缺少配置
include /etc/nginx/modules-enabled/*.conf; # 包含模块,不加的话会有:rtmpunknown directive "rtmp" in /etc/nginx/nginx.conf
参考地址:
https://blog.csdn.net/xiatiancc/article/details/83817514
https://blog.csdn.net/elesos/article/details/80899787
https://blog.csdn.net/kingroc/article/details/50839994
主要转自:
原文:https://blog.csdn.net/kingroc/article/details/50839994 作者:王小鹏鹏 来源:CSDN
链接:https://www.jianshu.com/p/c0543ec0981a 来源:简书 作者:baymin