Flv.js 是由 bilibili 网站开源的 HTML5 Flash 视频(FLV)播放器,纯原生 JavaScript 开发(ECMAScript 6 编写) ,没有用到 Flash。
它的工作原理是 Flv.js 在 JavaScript 中流式解析 flv 文件流,并实时转封装为 fmp4 ,通过 Media Source Extensions 喂给浏览器,实现了 FLV 格式视频的播放。
GitHub - bilibili/flv.js: HTML5 FLV Player
如果你已经安装了nodejs可以使用 npm来安装 flv.js
当然你也可以使用其他方式进行下载
在下载好的文件夹中找到dist文件夹中的flv.min.js复制出来
可以使用简单的服务器测试
简单html测试代码:
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>flv.js demo</title>
<style>
.mainContainer {
display: block;
width: 1024px;
margin-left: auto;
margin-right: auto;
}
.urlInput {
display: block;
width: 100%;
margin-left: auto;
margin-right: auto;
margin-top: 8px;
margin-bottom: 8px;
}
.centeredVideo {
display: block;
width: 100%;
height: 576px;
margin-left: auto;
margin-right: auto;
margin-bottom: auto;
}
.controls {
display: block;
width: 100%;
text-align: left;
margin-left: auto;
margin-right: auto;
}
</style>
</head>
<body>
<div class="mainContainer">
<video id="videoElement" class="centeredVideo" controls autoplay width="1024" height="576">Your browser is too old which doesn't support HTML5 video.</video>
</div>
<br>
<div class="controls">
<!--<button onclick="flv_load()">加载</button>-->
<button onclick="flv_start()">开始</button>
<button onclick="flv_pause()">暂停</button>
<button onclick="flv_destroy()">停止</button>
<input style="width:100px" type="text" name="seekpoint" />
<button onclick="flv_seekto()">跳转</button>
</div>
<script src="flv.min.js"></script>
<script>
var player = document.getElementById('videoElement');
if (flvjs.isSupported()) {
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: '你的视频.flv'
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load(); //加载
}
function flv_start() {
player.play();
}
function flv_pause() {
player.pause();
}
function flv_destroy() {
player.pause();
player.unload();
player.detachMediaElement();
player.destroy();
player = null;
}
function flv_seekto() {
player.currentTime = parseFloat(document.getElementsByName('seekpoint')[0].value);
}
</script>
</body>
</html>
React测试代码:
以下getFlvVideoStreamApi为接口地址,根据自己返回视频流或mp4文件格式来调整即可
// 获取直播视频流
const goVideo = async (params: any) => {
getFlvVideoStreamApi(params)
.then((res) => {
if (res && res.code === 200 && res.data) {
let player = videoRef.current;
let suffix = (res.data.url || '').split('.');
(window as any).flvPlayer?.destroy(); //一定要做销毁
if (suffix[suffix.length - 1] === 'flv') {
if (flvjs.isSupported()) {
// flvjs: https://github.com/Bilibili/flv.js/blob/master/docs/api.md
(window as any).flvPlayer = flvjs.createPlayer({
type: 'flv',
isLive: true,
enableWorker: true,
enableStashBuffer: false,
stashInitialSize: 128,
// 空流:'https://monitorpull.roombox.xdf.cn/719d1ad9ea2dd0c806f26cd82de07adc/719d1ad9ea2dd0c806f26cd82de07adc1134397e7d62576fba305003a812237f.flv'
url: res.data.url, // res.data
});
(window as any).flvPlayer.attachMediaElement(player);
(window as any).flvPlayer.load(); //加载
(window as any).flvPlayer.pause();
} else {
console.error('not support flv file');
}
} else if (suffix[suffix.length - 1] === 'mp4') {
(window as any).flvPlayer = flvjs.createPlayer({
type: 'mp4',
url: res.data.url,
});
(window as any).flvPlayer.attachMediaElement(player);
(window as any).flvPlayer.load(); //加载
(window as any).flvPlayer.pause();
}
}
})
.catch((err) => console.error(err, 'video err'));
};
DOM:
<video
ref={videoRef}
controls
autoPlay
width="100%"
height="488"
style={{
width: `${videoFixed ? '400px' : '100%'}`,
height: `${videoFixed ? '288px' : '488px'}`,
}}
>
Your browser is too old which doesn't support HTML5 video.
</video>
其他方法规整:
video元素:const videoRef = useRef<HTMLVideoElement>(null);
flvjs引入: <script type="text/javascript" src="<%= context.config.publicPath +'flvMin.js'%>"></script>
也可以引入线上的flv.min.js