chicken_dy/Assets/WX-WASM-SDK/WXVideo.cs

600 lines
15 KiB
C#
Raw Normal View History

2022-08-01 03:47:37 +00:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
namespace WeChatWASM
{
public class WXVideo
{
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoPlay(string id);
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoAddListener(string id, string key);
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoDestroy(string id);
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoExitFullScreen(string id);
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoPause(string id);
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoRequestFullScreen(string id,int direction);
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoSeek(string id, int time);
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoStop(string id);
#if UNITY_WEBGL
[DllImport("__Internal")]
#endif
private static extern void WXVideoRemoveListener(string id, string key);
#if UNITY_WEBGL && !UNITY_EDITOR
private static readonly bool isWebGLPlayer = true;
#else
private static readonly bool isWebGLPlayer = false;
#endif
private bool isWaitingPlay = false;
private bool isWaitingStop = false;
private bool isWaitingPause = false;
private bool _isPlaying = false;
private Action _onPlay = null;
private Action _onPause = null;
private Action _onEnded = null;
private Action<WXVideoTimeUpdate> _onTimeUpdate = null;
private Action<WXVideoProgress> _onProgress = null;
private Action _onError = null;
private Action _onWaiting = null;
private Action _onSeeking = null;
private Action _onSeeked = null;
private WXCreateVideoParam param;
public string instanceId;
//内部使用,请不要访问这个
public static Dictionary<string, WXVideo> _Dict = new Dictionary<string, WXVideo>();
public WXVideo(string id, WXCreateVideoParam param)
{
instanceId = id;
this.param = param;
_Dict.Add(id, this);
OnPlay(() => {
_isPlaying = true;
});
OnEnded(() => {
_isPlaying = false;
});
OnPause(() => {
_isPlaying = false;
});
#if UNITY_EDITOR
_isPlaying = param.autoplay;
#endif
}
/// <summary>
/// 内部函数,请不要调用
/// </summary>
/// <param name="key"></param>
public void _HandleCallBack(WXVideoCallback res)
{
switch (res.errMsg)
{
case "onPlay":
_onPlay?.Invoke();
break;
case "onPause":
_onPause?.Invoke();
break;
case "onEnded":
_onEnded?.Invoke();
break;
case "onTimeUpdate":
_onTimeUpdate?.Invoke(new WXVideoTimeUpdate() {
position = res.position,
duration = res.duration
});
break;
case "onProgress":
_onProgress?.Invoke(new WXVideoProgress() {
buffered = res.buffered,
duration = res.duration
});
break;
case "onError":
_onError?.Invoke();
break;
case "onWaiting":
_onWaiting?.Invoke();
break;
case "onSeeking":
_onSeeking?.Invoke();
break;
case "onSeeked":
_onSeeked?.Invoke();
break;
}
}
/// <summary>
/// 是否正在播放
/// </summary>
public bool isPlaying
{
get
{
return _isPlaying;
}
}
/// <summary>
/// 播放视频
/// </summary>
public void Play()
{
if (isWebGLPlayer)
{
if (!isWaitingPlay)
{
isWaitingPlay = true;
WXSDKManagerHandler.Instance.StartCoroutine(DoPlay());
}
return;
}
Debug.Log(param.src + " 视频播放了,这里就不真的播放了。");
_HandleCallBack(new WXVideoCallback() {
errMsg= "onPlay"
});
}
private IEnumerator DoPlay()
{
//这里unity音频调用太频繁延迟0.1秒后再执行
yield return new WaitForSeconds(0.1f);
WXVideoPlay(instanceId);
isWaitingPlay = false;
}
/// <summary>
/// 监听视频播放事件
/// </summary>
public void OnPlay(Action action)
{
if (_onPlay == null)
{
if (isWebGLPlayer)
{
WXVideoAddListener(instanceId, "onPlay");
}
}
_onPlay += action;
}
/// <summary>
/// 取消监听视频播放事件,action 为空表示移除全部事件监听
/// </summary>
public void OffPlay(Action action = null)
{
if (action == null)
{
_onPlay = null;
}
else
{
_onPlay -= action;
}
if (_onPlay == null)
{
if (isWebGLPlayer)
{
WXVideoRemoveListener(instanceId, "offPlay");
}
}
}
/// <summary>
/// 监听视频播放到末尾事件
/// </summary>
public void OnEnded(Action action)
{
if (_onEnded == null)
{
if (isWebGLPlayer)
{
WXVideoAddListener(instanceId, "onEnded");
}
}
_onEnded += action;
}
/// <summary>
/// 取消监听视频播放到末尾事件
/// </summary>
public void OffEnded(Action action = null)
{
if (action == null)
{
_onEnded = null;
}
else
{
_onEnded -= action;
}
if (_onEnded == null)
{
if (isWebGLPlayer)
{
WXVideoRemoveListener(instanceId, "offEnded");
}
}
}
/// <summary>
/// 监听视频错误事件
/// </summary>
public void OnError(Action action)
{
if (_onError == null)
{
if (isWebGLPlayer)
{
WXVideoAddListener(instanceId, "onError");
}
}
_onError += action;
}
/// <summary>
/// 取消监听视频错误事件,action 为空表示移除全部事件监听
/// </summary>
public void OffError(Action action = null)
{
if (action == null)
{
_onError = null;
}
else
{
_onError -= action;
}
if (_onError == null)
{
if (isWebGLPlayer)
{
WXVideoRemoveListener(instanceId, "offError");
}
}
}
/// <summary>
/// 监听视频暂停事件
/// </summary>
public void OnPause(Action action)
{
if (_onPause == null)
{
if (isWebGLPlayer)
{
WXVideoAddListener(instanceId, "onPause");
}
}
_onPause += action;
}
/// <summary>
/// 取消监听视频暂停事件,action 为空表示移除全部事件监听
/// </summary>
public void OffPause(Action action = null)
{
if (action == null)
{
_onPause = null;
}
else
{
_onPause -= action;
}
if (_onPause == null)
{
if (isWebGLPlayer)
{
WXVideoRemoveListener(instanceId, "offPause");
}
}
}
/// <summary>
/// 监听视频由于需要缓冲下一帧而停止时触发
/// </summary>
public void OnWaiting(Action action)
{
if (_onWaiting == null)
{
if (isWebGLPlayer)
{
WXVideoAddListener(instanceId, "onWaiting");
}
}
_onWaiting += action;
}
/// <summary>
/// 取消监听视频由于需要缓冲下一帧而停止时触发,action 为空表示移除全部事件监听
/// </summary>
public void OffWaiting(Action action = null)
{
if (action == null)
{
_onWaiting = null;
}
else
{
_onWaiting -= action;
}
if (_onWaiting == null)
{
if (isWebGLPlayer)
{
WXVideoRemoveListener(instanceId, "offWaiting");
}
}
}
/// <summary>
/// 销毁当前实例
/// </summary>
public void Destroy()
{
if (isWebGLPlayer)
{
WXVideoDestroy(instanceId);
}
else
{
Debug.Log(param.src + " 视频销毁!");
}
_Dict.Remove(instanceId);
}
/// <summary>
/// 视频退出全屏
/// </summary>
public void ExitFullScreen() {
if (isWebGLPlayer)
{
WXVideoExitFullScreen(instanceId);
}
else
{
Debug.Log(param.src + " 视频退出全屏!");
}
}
/// <summary>
/// 暂停
/// </summary>
public void Pause()
{
if (isWebGLPlayer)
{
if (!isWaitingPause)
{
isWaitingPause = true;
WXSDKManagerHandler.Instance.StartCoroutine(DoPause());
}
return;
}
Debug.Log(param.src + " 视频暂停了");
_HandleCallBack(new WXVideoCallback()
{
errMsg = "onPause"
});
}
IEnumerator DoPause()
{
//这里调用太频繁延迟0.1秒后再执行
yield return new WaitForSeconds(0.1f);
WXVideoPause(instanceId);
isWaitingPause = false;
}
/// <summary>
/// 视频全屏
/// </summary>
/// <param name="direction">设置全屏时视频的方向 0: 正常竖向, 90: 屏幕逆时针90度 . -90: 屏幕顺时针90度</param>
public void RequestFullScreen(int direction) {
if (isWebGLPlayer)
{
WXVideoRequestFullScreen(instanceId, direction);
}
else
{
Debug.Log(param.src + " 视频全屏!");
}
}
/// <summary>
/// 视频跳转
/// </summary>
/// <param name="time">视频跳转到指定位置,单位为 s 秒</param>
public void Seek(int time)
{
WXVideoSeek(instanceId, time);
}
/// <summary>
/// 停止视频
/// </summary>
public void Stop()
{
if (isWebGLPlayer)
{
if (!isWaitingStop)
{
isWaitingStop = true;
WXSDKManagerHandler.Instance.StartCoroutine(DoStop());
}
return;
}
Debug.Log(param.src + " 音频停止了");
}
IEnumerator DoStop()
{
//这里unity调用太频繁延迟0.1秒后再执行
yield return new WaitForSeconds(0.1f);
WXVideoStop(instanceId);
isWaitingStop = false;
}
/// <summary>
/// 监听视频播放进度更新事件
/// </summary>
/// <param name="action"></param>
public void OnTimeUpdate(Action<WXVideoTimeUpdate> action)
{
if (_onTimeUpdate == null)
{
if (isWebGLPlayer)
{
WXVideoAddListener(instanceId, "onTimeUpdate");
}
}
_onTimeUpdate += action;
}
/// <summary>
/// 取消监听视频播放进度更新事件,action 为空表示移除全部事件监听
/// </summary>
public void OffTimeUpdate(Action<WXVideoTimeUpdate> action = null)
{
if (action == null)
{
_onTimeUpdate = null;
}
else
{
_onTimeUpdate -= action;
}
if (_onTimeUpdate == null)
{
if (isWebGLPlayer)
{
WXVideoRemoveListener(instanceId, "offTimeUpdate");
}
}
}
/// <summary>
/// 监听视频下载(缓冲)事件
/// </summary>
/// <param name="action"></param>
public void OnProgress(Action<WXVideoProgress> action)
{
if (_onTimeUpdate == null)
{
if (isWebGLPlayer)
{
WXVideoAddListener(instanceId, "onProgress");
}
}
_onProgress += action;
}
/// <summary>
/// 取消监听视频下载(缓冲)事件 ,action 为空表示移除全部事件监听
/// </summary>
public void OffProgress(Action<WXVideoProgress> action = null)
{
if (action == null)
{
_onProgress = null;
}
else
{
_onProgress -= action;
}
if (_onProgress == null)
{
if (isWebGLPlayer)
{
WXVideoRemoveListener(instanceId, "offProgress");
}
}
}
}
}