hls.js 播放音视频切片鉴权问题 | laravel china 社区-金年会app官方网
<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完全相同的方式进行签名
原始m3u8内容
使用hls/sign签名后返回的内容
其他云自行查阅文档,部分公有云的对象存储是没有这个功能的
方案2:自行处理
我刚好有使用这个功能,仅供参考
之前用七牛的两种方案是: