首页 > 解决方案 > RTMP 到 HLS 多变体的问题

问题描述

我有一台服务器可以在端口 1935 上成功流式传输 RTMP。我可以从 VLC 访问此流。地址是 rtmp://localhost:1935/live

我还可以成功使用 Nginx-RTMP-Module https://github.com/arut/nginx-rtmp-module在 HLS 中进行流式传输。在 nginx 中,我将 RTMP 转换为 HLS 路径,并有一个服务器块通过 http(s) 为生成的 .m3u8 文件提供服务。

我遇到的问题是按照上面命名库中的建议配置 HLS 变体时。

澄清一下:RTMP 到 HLS 工作正常,但问题是在尝试提供多种变体时。这是我到目前为止所做的并进行了一些调查,但仍在努力为我的 m3u8 服务,我不断收到 404,当我运行 top 命令时,我什么也看不到。我还将 Nginx conf 中的用户从 www-data 更改为 Ubuntu。

当前配置:

运行 Ubuntu 18.04 在端口 1935 上拉 RTMP 通过 https 访问是:https: //rtmp.dev/live/stream.m3u8(当我有一个流时,此配置工作正常)

Nginx.conf


user ubuntu;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
}

http {

    sendfile off;
    tcp_nopush on;
    keepalive_timeout 65;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;  
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}




rtmp {
    server {
            listen 1935;
            chunk_size 4000;
       appliation src {
        live on;
        exec ffmpeg -i rtmp://127.0.0.1/live/$name
            -c:a libfdk_aac -b:a 32k  -c:v libx264 -b:v 128K -f flv rtmp://localhost/hls/$name_low
                -c:a libfdk_aac -b:a 64k  -c:v libx264 -b:v 256k -f flv rtmp://localhost/hls/$name_mid
                -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost/hls/$name_hi;

       }

            application live {
                    live on;
                hls on;
                    hls_path /home/ubuntu/hls;
            hls_nested on;
                    hls_fragment 3;
                    hls_playlist_length 60;
            hls_variant _low BANDWIDTH=160000;
                    hls_variant _mid BANDWIDTH=320000;
                    hls_variant _hi  BANDWIDTH=640000;   

            }
    }

}

这是允许通过 https 访问的服务器 nginx 服务器块


server {

     listen 80 http2;
     listen [::]:80 http2;
     listen 443 http2 ssl;
         ssl on;

         ssl_certificate         /home/ubuntu/ssl/domain-ca-bundle.crt;
         ssl_certificate_key     /home/ubuntu/ssl/domain.key;
         ssl_session_timeout 10m;
         ssl_session_cache shared:SSL:20m;
         ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
         ssl_prefer_server_ciphers       on;

    root /home/ubuntu/hls;
        server_name rtmp.dev;

        location / {

       types {
                application/dash+xml mpd;
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }

      }
 }




我使用 FFMPEG 在 RTMP 中进行流式传输,并且可以自己播放 stream.m3u8 流,但是当设置了多变体时,这将变成 404 响应。

如您所见,Nginx 在 /home/ubuntu/hls 中存储了一个文件,但是当我将 nginx conf 更改为多变体版本时,此文件夹为空。

我的猜测是这个问题可能是FFMPEG无法访问这个文件夹但是我将nginx用户更改为ubuntu并重新加载了nginx,一旦我这样做了这个文件夹所有者就变成了ubuntu

drwxr-xr-x 2 ubuntu www-data 4096 Jul 23 12:26 hls

是否有我需要调查的权限问题?您以前遇到过同样的问题吗?

感谢您的投入。

标签: nginxhttp-live-streamingrtmp

解决方案


根据Docs,您的 ffmpeg 输入使用的是实时路径,但您的应用程序的路径是src。更正的版本是这样的:

  appliation src {
    live on;
    exec ffmpeg -i rtmp://127.0.0.1/src/$name
        -c:a libfdk_aac -b:a 32k  -c:v libx264 -b:v 128K -f flv rtmp://localhost/live/$name_low
            -c:a libfdk_aac -b:a 64k  -c:v libx264 -b:v 256k -f flv rtmp://localhost/live/$name_mid
            -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost/live/$name_hi;

   }

推荐阅读