三生有幸,四季如春 | 言文

Nginx Rtmp 搭建视频推流服务

2020.02.13

NGINX-based Media Streaming Server

背景

由于国内各大视频直播网站都需要在实名认证以外上传手持身份证照片,且画质和码率受平台所限制,对于临时共享使用而不想去注册的用户来说较为不便。

Real Time Messaging Protocol (RTMP) 实时消息通讯协议,在特定语境下俗称为推流,将本地录制内容推送到远端服务器存储或共享给远端用户查看。

http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf

录制软件

一般使用 obs-studio 这款功能强大的开源软件

下载 : https://obsproject.com/

一般网上公共的直播平台会提供给你一个推流地址(以 rtmp:// 开头)和推流密钥,填入 obs-studio 对应的设置即可,对于一些海外知名的平台,obs-studio 内置有相应的配置模板,仅需填入 stream key。

nginx rtmp 服务配置

Nginx 本身并不带 RTMP 模块,需要自行编译使用,可以参考官方文档和 AUR 已经写好的 PKGBUILD 文件

https://aur.archlinux.org/packages/nginx-mod-rtmp/ https://github.com/arut/nginx-rtmp-module


# nginx.conf

...
# 加载编译好的模块
load_module modules/ngx_rtmp_module.so;

...

# 加载 rtmp 配置文件
rtmp {
    include /etc/nginx/rtmplive.conf;
}

http {
    ...

    include /etc/nginx/rtmpserver.conf;

    ...
}
# rtmplive.conf 服务配置文件

server {
    # 监听地址(以本地服务为例)
    listen 1935;

    # 数据块大小
    chunk_size 4096;

    application live {
        live on;
        on_publish http://localhost:1904/auth.php;
        on_play http://localhost:1904/auth.php;
        record off;
    }

    # 在线播放本地视频
    #    application videos {
    #        play /tmp/rtmpserver/videos;
    #    }
}
# rtmpserver.conf 站点配置文件

server {
    listen 1904;
    server_name localhost;

    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }

    location /stat.xsl {
        root /opt/RTMP/static/;
    }

    # 简易认证(不安全实现)
    location /auth {
        auth_basic "Auth Basic";
        auth_basic_user_file /etc/nginx/.htpasswd;
        root /opt/RTMP/static/;
        index index.php;
        return 404;
    }
}
# index.php 简易认证
<?php
    $username = $_POST["name"]; # in our current example, this will be 'john'
    $password = $_POST["psk"]; # in our current example, this will be 'supersecret
    
     # 用户名密码
    $valid_users = array("john" => "supersecret",
                        "winnie" => "thepooh",
                        "batman" => "nananananananana");

    if ($valid_users[$username] == $password) {
        http_response_code(201); # return 201 "Created"
    } 
    else {
        http_response_code(404); # return 404 "Not Found"
    }
?>
  • .htpasswd 文件可以使用 apache 的 htpasswd 工具生成,对应推流时所需的 stream key。其格式为 用户名:密码,权限 600

  • stat.xsl 状态页面文件可以从模块上游提供的地址下载

https://github.com/arut/nginx-rtmp-module/blob/master/stat.xsl

在线播放

暂时没找到比较好的网页播放方案,本地播放可使用 VLC 播放器等。

comments powered by Disqus