hls.js 播放音视频切片鉴权问题
<template>
<div>
<audio ref="audioPlayer" controls />
<button @click="playAudio">播放音频</button>
</div>
</template>
<script setup lang="ts">
import Hls from 'hls.js';
import { ref, onMounted, onBeforeUnmount } from 'vue';
const audioPlayer = ref<HTMLAudioElement | null>(null);
const audioUrl = 'https://pep-file.oss-cn-beijing.aliyuncs.com/zjOutResource/xxx/6101/8_b1_16/8_b1_16.m3u8?auth_key=xx';
const playAudio = () => {
if (audioPlayer.value) {
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource(audioUrl);
hls.attachMedia(audioPlayer.value);
hls.on(Hls.Events.MANIFEST_PARSED, () => {
audioPlayer.value?.play();
});
} else {
audioPlayer.value.src = audioUrl;
audioPlayer.value.addEventListener('loadedmetadata', () => {
audioPlayer.value?.play();
});
}
}
}
onMounted(() => {
audioPlayer.value?.load();
})
onBeforeUnmount(() => {
if (audioPlayer.value) {
audioPlayer.value.src = '';
}
})
</script>
<style scoped>
</style>
问题:
音频路径audioUrl
需要鉴权才能访问,但是m3u8里面的hls.key和.ts文件如何实现自动鉴权
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="hls.key",IV=0x6b75eb391048f9416d3a475499489390
#EXTINF:7.274833,
part_0000.ts
#EXT-X-ENDLIST
本作品采用《CC 协议》,转载必须注明作者和本文链接
一般都是后端创建一个限时url返回前台,比如限时一天有效期
我之前是用nginx的internal限制的
写个video.php的处理脚本
nginx 收到调整资源/videos/test.mp4的请求
前端直接src读video.php,video.php怎么加参数都可以
如果你的意思是指文件不能公开访问(比如对象存储储存桶私有),生成了m3u8文件的签名链接,但是m3u8文件里面指向的ts切片却没有携带签名。
方案1:公有云自带处理方案。
比如阿里云,使用hls/sign签名边转边播,OSS对音视频数据的访问提供了动态签名机制,即只需在首次访问m3u8文件时在URL中添加x-oss-process=hls/sign,live_1, OSS将对返回的播放列表中的所有ts地址自动按照与m3u8完全相同的方式进行签名
help.aliyun.com/zh/oss/user-guide/...
developer.qiniu.com/kodo/kb/1339/i...
原始m3u8内容
使用hls/sign签名后返回的内容
其他云自行查阅文档,部分公有云的对象存储是没有这个功能的
方案2:自行处理
我刚好有使用这个功能,仅供参考
之前用七牛的两种方案是: