问题
我正在使用 Nginx Plus 中的 HLS 模块来流式传输 .mp4 文件,使用以下配置:
location /hls {
hls;
hls_fragment 10s;
hls_buffers 10 10m;
hls_mp4_buffer_size 1m;
hls_mp4_max_buffer_size 10m;
alias /var/www/vod/cache;
}
当 .mp4 文件存在于/var/www/vod/cache
. 当客户端请求时http://example.com/hls/file.mp4.m3u8
,HLS 模块会即时生成 m3u8 播放列表并将其返回。
但是,我宁愿不将所有 mp4 文件存储在流服务器上,而是将文件存储在后端存储服务器上。理想情况下,mp4 文件只会在客户端请求特定视频时从存储服务器检索并存储在本地(稍后将通过 cron 作业删除)。使用 proxy_store 我可以检索 mp4 文件并使用如下配置将它们存储在本地:
location @fetch_content {
internal;
rewrite ^/hls(.*).mp4.m3u8$ $1.mp4 break;
proxy_pass http://example-storage.com;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /tmp;
root /var/www/vod/cache;
}
使用proxy_pass的问题是nginx直接返回mp4文件给客户端,而不是m3u8播放列表。
是否可以让 nginx 检索并存储 mp4 文件,然后使用 HLS 模块生成 m3u8 播放列表文件?或者另一种说法,我可以检查 mp4 文件是否存在,如果找不到,则检索并存储它,然后点击将使用 HLS 模块流式传输文件的 /hls 位置?
由于这是 Nginx Plus,我无法编写模块。我只能使用包含的模块,请参见此处https://www.nginx.com/products/technical-specs/