搭建流媒体服务器

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

版权声明:本文为zhumengke原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhumengke/articles/11206794.html