0.1.5 • Published 1 year ago

@vanwei-wcs/wwav-player-webdecodecs v0.1.5

Weekly downloads
-
License
MIT
Repository
-
Last release
1 year ago

wwav-player-webdecodecs

播放 wwav 格式的视频url 的播放器

安装

npm i @vanwei-wcs/wwav-player-webdecodecs
import WWAVPlayer from '@vanwei-wcs/wwav-player-webdecodecs'
const url = 'ws://192.168.8.120:3094/mts/wwav/W867651902yzwfQzpCcNPUd283Gjs.wwav'
const token = 'c70mxehw'

var player = new WWAVPlayer({
	debug: false // 当前只有这一个属性
});

方法

  • attachVideoElement()
  • attachCanvasElement()
  • open()
  • play()
  • pause()
  • on()
  • off()
  • destroy()

attachVideoElement()

player.attachVideoElement(node:HTMLVideoElement,options:Options)

用来配置播放 h264 流需要用来到的 dom 和参数

Options |属性|说明|类型|可选值|默认值| |---|---|---|---|---| |mode|播放模式|string|both、video、audio|video| |flushingTime|buffer缓冲区刷新毫秒间隔|number|-|500| |maxDelay|最大毫秒延迟|number|-|500| |debug|是否开启 h264 播放器的debug模式|boolean|-|false|

attachCanvasElement()

player.attachCanvasElement(node:HTMLCanvasElement,options:Options)

用来配置播放 h265 流需要用来到的 dom 和参数

Options

  • baseLibPath

设置此属性时,请先在 statics/h265 文件夹下面找到 libffmpeg_265.jslibffmpeg_265.wasm 这两个文件。

此属性用来在 web worker 中拼接出 libffmpeg_265.jslibffmpeg_265.wasm 两个文件的下载路径,然后使用 importScript(libffmpeg_265.js)fetch(libffmpeg_265.wasm) 下载这两个文件,默认值为 /lib/

有两种设置方式

  • 相对路径

拼接规则为 location.origin + baseLibPath + 'libffmpeg_265.js', 例如:baseLibPath = '/public/',当前运行脚本的 location.originhttp://192.168.1.10:9000, 则最后的拼接地址为 http://192.168.1.10:9000/public/libffmpeg_265.js

  • 一种是绝对路径,拼接规则为 baseLibPath + 'libffmpeg_265.js'

  • 绝对路径

拼接规则为 baseLibPath + 'libffmpeg_265.js', 例如:baseLibPath = 'http://192.168.1.10:9000/public/' ,则最后的拼接地址为 http://192.168.1.10:9000/public/libffmpeg_265.js

无论设置哪一种方式,都必须要求可以通过此链接访问 libffmpeg_265.js 文件内容, libffmpeg_265.jslibffmpeg_265.wasm 这两个文件必须在同一个文件夹下面

  • debug

开启 H265 播放器 debug 模式

  • decoderLogLevel

设置 H265 解码器的日志等级,js-0; wasm-1; ffmpeg-2

open()

player.open(url:string,token:string)

url 为 wwav 格式的视频地址,token 为视频地址密码

play()

当视频正在播放时,调用此方法可以暂停视频播放

pause()

当视频暂停后,调用此方法可以开始播放视频

on()

监听播放器回调事件,具体定义参看下方静态属性 PlayerEvents |事件|说明|参数| |---|---|---| |error|播放发生错误,具体错误参考下方错误回调|{errorType,detail,info}| |play|视频开始播放|event| |pause|视频暂停播放|event| |media_info|解码出来的视频信息,format(流格式H264/H265),width(视频分辨率宽度),height(视频分辨率高度)|{format,width,height}|

player.on("media_info", ({format,width,height}) => {
	console.log("media_info", format,width,height);
});

off()

取消 on 方法监听的事件的回调

// off(eventName,listener)
player.off("media_info");
// 不指定listener,则取消事件名对应的所有回调

如果需要取消所有回调,调用 offAll() 方法

destroy()

销毁播放器,异步方法,返回promise

静态属性和方法

PlayerEvents

回调事件枚举属性

{
	ERROR: 'error',
	PLAY: 'play',
	PAUSE: 'pause',
	MEDIA_INFO: 'media_info'
}
player.on(WWAVPlayer.PlayerEvents.ERROR, (errorType,detail,info) => {
	console.log("media_info", errorType,detail,info);
	// errorType 对应于下方 ErrorTypes 的值
	// detail 对应于下方 ErrorDetails 的值
});

ErrorTypes

error 回调事件的错误类型枚举

ErrorTypes = {
	NETWORK_ERROR: 'network_error',
	MEDIA_ERROR: 'media_error',
	OTHER_ERROR: 'other_error'
}
类型说明
network_error通常是提供的视频地址无法连接,密码不正确无法认证等网络错误
media_error通常是没有提供视频需要的正确 dom 元素,最好在播放前把 video 和 canvas 元素都绑定,因为无法提前确定当前视频url获取到的视频流是 H264 还是 H265
other_error其他错误

ErrorDetails

error 回调事件的错误描述枚举

ErrorDetails = {
	NETWORK_AUTH_FAILED: 'network_auth_failed',
	NETWORK_ON_CLOSE: 'network_close',
	NETWORK_ON_ERROR: 'network_error',

	MEDIA_INVALID_ELEMENT: 'media_invalid_element'
}
类型说明
network_auth_failed视频url认证失败错误,通常是密码不正确
network_close连接视频url 的 websocket 实例断开连接的回调
network_error通常是提供的视频地址url无法连接,或连接异常断开
media_invalid_element获取到视频流后,发现提供的dom元素不是所需要的,就会触发此错误。例如接收到的是 H264 流,但是没有绑定 video dom元素,或接收到的是 H265 流,但是没有绑定 canvas dom元素

isSupported()

检查当前浏览器是否支持播放

	const isSuppotred = WWAVPlayer.isSupported()

demo

<script>
	var video = document.getElementById("video");
	var canvas = document.getElementById("canvas");

	var player = null;

	var url = 'ws://192.168.8.10/xxxxxfesfsfsf.wwav'
	var token = 'xxxxxx'

	function open() {
		try {
			if (player) {
				player.destroy();
			}
			player = new WWAVPlayer({
				debug: false,
			});

			player.attachVideoElement(video);
			player.attachCanvasElement(canvas, {
				baseLibPath: "/statics/h265/",
				debug: false,
			});

			player.on("error", (error_type, detail, info) => {
				console.error("player error", error_type, detail, info);
				errorSpan.innerHTML =
					detail + (info.message ? " : " + info.message : "");
			});
			player.on("play", (event) => {
				console.log("play", event);
			});
			player.on("pause", (event) => {
				console.log("pause", event);
			});
			player.on("media_info", (event) => {
				console.log("media_info", event);
			});

			player.open(url, token);
		} catch (error) {
			console.error("error", error);
		}
	}

	function stop() {
		if (player) {
			player.destroy();
		}
		player = null;
	}

	function play() {
		if (player) {
			player.play();
		}
	}
	function pause() {
		if (player) {
			player.pause();
		}
	}
</script>