nginx - 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
是否有我需要调查的权限问题?您以前遇到过同样的问题吗?
感谢您的投入。
解决方案
根据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;
}
推荐阅读
- javascript - 如何将链接添加到城市列表?
- javascript - 将 Storybook/vue 与 SCSS 一起使用
- java - How to fix weird Android Studio editor mode?
- android - 我还能在最新版本的安卓收件箱中删除短信吗?
- node.js - NodeJS - 部署后路径中断
- ios - 使用 UIExfield 搜索
- python - 使用 Scrapy 抓取数据时如何处理身份验证和验证码
- c - 我的代码的时间复杂度是 O(n+m)?
- javascript - JS 中的自定义 Intl.Collator
- python - 调整 doc2vec 的大小参数