我花了很多时间寻找答案,相信我,我尝试了一切。 我正在运行一个将rtmp流推送到HLS流的nginx服务器。
以下是我的nginx.conf
的一部分location /hls {
types {
application/vnd.apple.mpegurl m3u8;
}
root /mnt/;
set $auth_request_uri "http://SERVER:8000/auth_ext.php?token=$arg_token";
auth_request /auth/;
add_header Cache-Control no-cache; # Prevent caching of HLS fragments
add_header Access-Control-Allow-Origin *; # Allow web player to access our playlist
}
location /auth/ {
internal;
proxy_pass $auth_request_uri;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
我正在尝试通过php页面验证流,我从URL获取参数,然后如果它与我的数据库中的令牌匹配则响应200 OK。
到目前为止,我设法进行身份验证,这意味着如果令牌匹配,我可以访问http://SERVER:8080/hls/stream.m3u8?token=TOKEN,但这是发生的事情。
我有一个主m3u8流,可以根据带宽调整流,当我在控制台中访问stream.m3u8时,我看到了这个
http://SERVER:8080/hls/stream.m3u8?token=TOKEN
http://SERVER:8080/hls/stream_mid.m3u8
http://SERVER:8080/hls/stream_hd720.m3u8
http://SERVER:8080/hls/stream_src.m3u8
其中最后三个m3u8响应404,因为参数没有通过,因此我有一个永不加载的流,但URL确实响应。 此外,在m3u8本身,.ts文件也获得404。
如何解决这个问题,每当第一次调用第一个m3u8时,可以访问剩余的m3u8和ts文件,或者返回200个代码?
我真的希望自己明确表示,我可以提供更多细节
谢谢大家
答案 0 :(得分:0)
不会在请求之间共享身份验证结果。您必须为所有变体播放列表和媒体片段的每个新请求提供相同的令牌。
要实现此目的,您必须重写主HLS清单和变体HLS清单,并将令牌添加到每个包含的URL。一种解决方案是使用PHP包装器拦截所有.m3u8
个请求,解析播放列表并即时添加令牌,然后返回具有正确MIME类型(application/x-mpegURL
或{{1}的结果}})。
作为最后一点,您应该使用签名令牌以避免重复使用。