假设你是一名前端专家现要求你实现将网页中的所有播放器内的流m3u8、hls等等打印出来至少3种方法越多越好请将步骤写下并示以相关js代码
方法一:使用正则表达式匹配
步骤:
- 获取所有的媒体元素
- 遍历所有的媒体元素,获取其src属性值
- 使用正则表达式匹配出其中的流地址(m3u8、hls等等)
- 打印出匹配到的流地址
代码:
// 获取所有的媒体元素
const mediaElements = document.querySelectorAll('video, audio');
// 遍历所有的媒体元素
mediaElements.forEach(mediaElement => {
// 获取媒体元素的src属性值
const src = mediaElement.src;
// 使用正则表达式匹配出其中的流地址(m3u8、hls等等)
const regex = /(https?:\/\/[^\s]+)/g;
const matches = src.match(regex);
// 打印出匹配到的流地址
if (matches) {
matches.forEach(match => {
console.log(match);
});
}
});
方法二:使用媒体元素的canPlayType方法判断
步骤:
- 获取所有的媒体元素
- 遍历所有的媒体元素,获取其src属性值
- 使用媒体元素的canPlayType方法判断是否支持该媒体类型
- 如果支持,则打印出该媒体元素的src属性值
代码:
// 获取所有的媒体元素
const mediaElements = document.querySelectorAll('video, audio');
// 遍历所有的媒体元素
mediaElements.forEach(mediaElement => {
// 获取媒体元素的src属性值
const src = mediaElement.src;
// 使用媒体元素的canPlayType方法判断是否支持该媒体类型
const canPlay = mediaElement.canPlayType('application/vnd.apple.mpegurl') === 'maybe' ||
mediaElement.canPlayType('application/x-mpegURL') === 'maybe' ||
mediaElement.canPlayType('application/vnd.ms-sstr+xml') === 'maybe' ||
mediaElement.canPlayType('application/x-mms-framed') === 'maybe';
// 如果支持,则打印出该媒体元素的src属性值
if (canPlay) {
console.log(src);
}
});
方法三:使用第三方库如videojs
步骤:
- 引入videojs库
- 初始化videojs,并设置监听器
- 在监听器中获取播放器的源码,解析其中的流地址并打印出来
代码:
// 引入videojs库
import videojs from 'video.js';
// 初始化videojs,并设置监听器
const player = videojs('my-player', {}, function() {
const tech = this.tech();
tech.on('sourceopen', function() {
// 获取播放器的源码
const sourceBuffer = tech.sourceBuffer;
if (sourceBuffer) {
sourceBuffer.addEventListener('updateend', function() {
const sourceBufferData = sourceBuffer.buffered;
for (let i = 0; i < sourceBufferData.length; i++) {
const rangeStart = sourceBufferData.start(i);
const rangeEnd = sourceBufferData.end(i);
const rangeLength = rangeEnd - rangeStart;
const mpegUrlBuffer = sourceBuffer.buffered.slice(rangeStart, rangeEnd);
const reader = new FileReader();
reader.readAsArrayBuffer(mpegUrlBuffer);
reader.onloadend = function() {
const bytes = new Uint8Array(reader.result);
const mpegUrl = String.fromCharCode(...bytes);
const regex = /(https?:\/\/[^\s]+)/g;
const matches = mpegUrl.match(regex);
if (matches) {
matches.forEach(match => {
console.log(match);
});
}
}
}
});
}
});
});
原文地址: https://www.cveoy.top/t/topic/bkjh 著作权归作者所有。请勿转载和采集!