Files
soulspace/uni_modules/yingbing-video/static/html/video.html
chenghuan a64d538cd3 feat: 新增心理论坛功能并优化订单相关文案;更新音视频播放组件版本;
- 新增心理论坛页面及文章详情页
- 更新订单状态文案:"待发货"改为"待发出","待收货"改为"待收到"
- 统一修改"收货地址"相关文案为"收件地址"
- 添加安卓应用包下载地址配置
- 更新依赖edu-core至v1.0.6版本
- 优化首页课程列表布局和样式
- 新增分享功能到我的页面
2026-02-28 16:32:38 +08:00

285 lines
7.6 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<html>
<head>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover">
<script type="text/javascript" src="js/hls.min.js"></script>
<script type="text/javascript" src="js/flv.min.js"></script>
<script type="text/javascript" src="js/jsmpeg.min.js"></script>
<script type="text/javascript" src="js/three.min.js"></script>
<script type="text/javascript" src="js/OrbitControls.js"></script>
<script type="text/javascript" src="js/DeviceOrientationControls.js"></script>
<script type="text/javascript" src="js/uni-webview-js@1.5.4.js"></script>
<script type="text/javascript" src="dist/yb-player-gesture.js"></script>
<script type="text/javascript" src="dist/yb-player-subtitle.js"></script>
<script type="text/javascript" src="dist/yb-player-danmu.js"></script>
<script type="text/javascript" src="dist/yb-player-pano.js"></script>
<script type="text/javascript" src="dist/yb-player-mpeg.js"></script>
<script type="text/javascript" src="dist/yb-player.js"></script>
<link rel="stylesheet" type="text/css" href="css/yb-player.css"/>
<link rel="stylesheet" type="text/css" href="css/yb-player-plugin.css"/>
<title>全局播放器</title>
<style>
html, body {
padding: 0;
margin: 0;
background-color: #000;
width: 100vw;
height: 100vh;
}
.btns {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: none;
flex-direction: row;
}
.yb-player {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<!-- Specify the player container -->
<div id="yb-player" class="yb-player">
</div>
<script>
var mp
//加载视频
function reloadVideo (arg) {
var params = parseArg(arg)
unload()
_traverseObject(params.custom, 'slotclick')
mp = new YbPlayer({
container:'#yb-player',
src: params.src,
segments: params.segments,
title: params.title,
poster: params.poster || undefined,
type: params.type,
three: params.three,
initialTime: params.initialTime,
duration: params.duration,
autoplay: params.autoplay,
preload: params.preload,
muted: params.muted,
playbackRate: params.playbackRate,
loop: params.loop,
isLive: params.isLive,
header: params.header,
controls: params.controls,
alwaysShowControls: params.alwaysShowControls,
height: '100%',
objectFit: params.objectFit,
crossOrigin: params.crossOrigin,
openDirection: params.openDirection,
exitDirection: params.exitDirection,
quality: params.quality,
works: params.works,
workIndex: params.workIndex,
subtitles: params.subtitles,
subtitleIndex: params.subtitleIndex,
custom: params.custom,
decoder: {
hls: {
loader: Hls,
config: parseHlsConfig(params.hlsConfig)
},
flv: {
loader: flvjs,
config: params.flvConfig
},
jsmpeg: {
loader: JSMpeg,
config: params.jsmpegConfig
}
}
})
mp.load()
mp.loadVideo()
mp.loadGestureEvent()
mp.onmessage = function (data) {
uni.postMessage({data})
}
window.addEventListener('resize', updateSize)
}
function updateSize () {
if( mp ) {
mp.refreshDanmu()
mp.refreshPano()
}
}
//动态修改video属性
function setVideo (key, value) {
if( mp ) mp.setVideo(key, value)
}
//加载弹幕
function loadDanmu () {
if ( mp ) {
if ( window.danmu && window.danmu.length ) mp.setConfig('danmu', window.danmu)
mp.unloadDanmu()
mp.loadDanmu()
window.dammu = null
}
}
//卸载弹幕
function unloadDanmu () {
if ( mp ) mp.unloadDanmu()
}
//发送弹幕
function sendDanmu (arg, border) {
var danmu = parseArg(arg)
if ( mp ) mp.sendDanmu(danmu, border)
}
//插入弹幕
function insertDanmu (arg) {
var danmu = parseArg(arg)
if ( mp ) mp.insertDanmu(danmu)
}
//更新配置
function updateConfig (arg) {
var config = parseArg(arg)
if ( mp ) {
Object.keys(config).forEach(key => {
mp.setConfig(key, config[key])
})
mp.hideControls()
}
}
//重加载自定义配置
function reloadCustom (arg) {
var config = parseArg(arg)
_traverseObject(config, 'slotclick')
if ( mp ) {
Object.keys(config).forEach(key => {
mp.setCustom(key, config[key])
})
mp.unloadCustom()
mp.loadCustom()
}
}
//播放/暂停
function toggle () {
if ( mp ) mp.toggle()
}
//播放
function play () {
if ( mp ) mp.video.play()
}
//暂停
function pause () {
if ( mp ) mp.video.pause()
}
//跳转
function seek (time) {
if ( mp ) mp.seek(time)
}
//开启全屏
function openFullscreen (direction) {
if ( mp ) mp.openFullscreen(direction)
}
//退出全屏
function exitFullscreen () {
if ( mp ) mp.exitFullscreen()
}
//消息提示
function showToast (arg) {
var data = parseArg(arg)
if ( mp ) mp.showToast(data)
}
//展示工具栏
function showToolbar (arg) {
var data = parseArg(arg)
_traverseObject(data, 'toolclick')
if ( mp ) mp.showToolbar(data.selector, data.list, data.checkShow, data.checkIndex)
}
//截图
function capture (arg) {
var data = parseArg(arg)
if ( mp ) mp.capture(data.type, data.show)
}
//禁用手势事件
function disableGesture () {
if ( mp ) mp.disableGesture()
}
//启用手势事件
function enableGesture () {
if ( mp ) mp.enableGesture()
}
//卸载视频
function unload () {
if ( mp ) {
mp.unloadDanmu()
mp.unloadGestureEvent()
mp.unloadVideo()
mp.unload()
window.removeEventListener('resize', updateSize)
}
}
//卸载视频
function destroy () {
unload()
uni.postMessage({data: {destroyed: true}})
}
//处理custom
function _traverseObject(obj, emitname) {
if (typeof obj !== 'object' || obj === null) {
return;
}
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
const value = obj[key];
if (key == 'click') {
var emit = {}
emit[emitname] = value
obj[key] = function () { uni.postMessage({data: emit}) }//点击事件通知
} else if (typeof value === 'object' && value !== null) {
_traverseObject(value, emitname);
}
}
}
}
//处理hlsConfig
function parseHlsConfig (config = {}) {
Object.keys(config).forEach(key => {
if ( ['xhrSetup'].includes(key) ) {
config[key] = eval(`(${config[key]})`);
}
if ( ['pLoader', 'fLoader'].includes(key) ) {
config[key] = (new Function(`return ${config[key]}`))();
}
})
return config
}
//设置弹幕数据webview专用
function setDanmuData (arg) {
var { code, data } = parseArg(arg)
if ( !window.danmu ) window.danmu = []
window.danmu = window.danmu.concat(data)
if ( code == 1 ) loadDanmu()
}
//转义参数
function parseArg (arg) {
try{
return JSON.parse(decodeURIComponent(decodeURIComponent(arg)))
}catch(e){
return arg
}
}
//通知app已经做好准备
function ready () {
uni.postMessage({data: {ready: true}})
}
if (document.readyState === 'complete') {
// 如果页面已经加载完成,直接执行函数
ready();
} else {
window.addEventListener('load', ready)
}
</script>
</body>
</html>