yjz-web-sdk 1.0.9-beta.2 → 1.0.9-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/util/WasmUtil.d.ts +9 -3
- package/lib/yjz-web-sdk.js +125 -21
- package/package.json +3 -3
- package/lib/yjz-web-sdk.umd.cjs +0 -981
package/lib/util/WasmUtil.d.ts
CHANGED
|
@@ -9,8 +9,14 @@ export declare enum VideoCodecType {
|
|
|
9
9
|
}
|
|
10
10
|
export declare function isDecoderSupported(codec: VideoCodecType): Promise<boolean>;
|
|
11
11
|
export declare function isEncoderSupported(codec: VideoCodecType): Promise<boolean>;
|
|
12
|
-
export declare const
|
|
13
|
-
export declare const isWebGPUSupported: () => boolean;
|
|
14
|
-
export declare const isWebGLSupported: (canvas?: HTMLCanvasElement) => boolean;
|
|
12
|
+
export declare const isWebGPUSupported: () => Promise<boolean>;
|
|
15
13
|
export declare const isWebGL2Supported: (canvas?: HTMLCanvasElement) => boolean;
|
|
14
|
+
export declare const isWebGL1Supported: (canvas?: HTMLCanvasElement) => boolean;
|
|
16
15
|
export declare const isCanvas2DSupported: (canvas?: HTMLCanvasElement) => boolean;
|
|
16
|
+
export declare const detectRenderingCapabilities: () => Promise<{
|
|
17
|
+
webgpu: boolean;
|
|
18
|
+
webgl2: boolean;
|
|
19
|
+
webgl1: boolean;
|
|
20
|
+
canvas2d: boolean;
|
|
21
|
+
best: string;
|
|
22
|
+
}>;
|
package/lib/yjz-web-sdk.js
CHANGED
|
@@ -15716,28 +15716,130 @@ async function isDecoderSupported(codec) {
|
|
|
15716
15716
|
}
|
|
15717
15717
|
}
|
|
15718
15718
|
const isMobileDevice = () => {
|
|
15719
|
-
|
|
15719
|
+
if (typeof navigator === "undefined")
|
|
15720
|
+
return true;
|
|
15721
|
+
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS|OPiOS/i.test(navigator.userAgent) || "ontouchstart" in window;
|
|
15720
15722
|
};
|
|
15721
|
-
|
|
15723
|
+
let _webgpuChecked = false;
|
|
15724
|
+
let _webgpuSupported = false;
|
|
15725
|
+
const isWebGPUSupported = async () => {
|
|
15722
15726
|
var _a;
|
|
15723
|
-
if (
|
|
15727
|
+
if (_webgpuChecked)
|
|
15728
|
+
return _webgpuSupported;
|
|
15729
|
+
if (isMobileDevice()) {
|
|
15730
|
+
_webgpuSupported = false;
|
|
15731
|
+
_webgpuChecked = true;
|
|
15724
15732
|
return false;
|
|
15725
|
-
|
|
15726
|
-
|
|
15727
|
-
|
|
15728
|
-
|
|
15729
|
-
|
|
15730
|
-
|
|
15733
|
+
}
|
|
15734
|
+
if (!("gpu" in navigator) || typeof ((_a = navigator.gpu) == null ? void 0 : _a.requestAdapter) !== "function") {
|
|
15735
|
+
_webgpuSupported = false;
|
|
15736
|
+
_webgpuChecked = true;
|
|
15737
|
+
return false;
|
|
15738
|
+
}
|
|
15739
|
+
try {
|
|
15740
|
+
const adapter = await navigator.gpu.requestAdapter();
|
|
15741
|
+
_webgpuSupported = !!adapter;
|
|
15742
|
+
} catch (e) {
|
|
15743
|
+
console.warn("[WebGPU] detection failed:", e);
|
|
15744
|
+
_webgpuSupported = false;
|
|
15745
|
+
} finally {
|
|
15746
|
+
_webgpuChecked = true;
|
|
15747
|
+
}
|
|
15748
|
+
return _webgpuSupported;
|
|
15731
15749
|
};
|
|
15750
|
+
let _webgl2Checked = false;
|
|
15751
|
+
let _webgl2Supported = false;
|
|
15732
15752
|
const isWebGL2Supported = (canvas) => {
|
|
15733
|
-
|
|
15734
|
-
|
|
15735
|
-
|
|
15753
|
+
if (_webgl2Checked)
|
|
15754
|
+
return _webgl2Supported;
|
|
15755
|
+
const testCanvas = document.createElement("canvas");
|
|
15756
|
+
const contextNames = ["webgl2", "experimental-webgl2"];
|
|
15757
|
+
let gl = null;
|
|
15758
|
+
for (const name of contextNames) {
|
|
15759
|
+
try {
|
|
15760
|
+
gl = testCanvas.getContext(name);
|
|
15761
|
+
if (gl)
|
|
15762
|
+
break;
|
|
15763
|
+
} catch (_) {
|
|
15764
|
+
}
|
|
15765
|
+
}
|
|
15766
|
+
_webgl2Supported = !!gl;
|
|
15767
|
+
_webgl2Checked = true;
|
|
15768
|
+
return _webgl2Supported;
|
|
15736
15769
|
};
|
|
15770
|
+
let _webgl1Checked = false;
|
|
15771
|
+
let _webgl1Supported = false;
|
|
15772
|
+
const isWebGL1Supported = (canvas) => {
|
|
15773
|
+
if (_webgl1Checked)
|
|
15774
|
+
return _webgl1Supported;
|
|
15775
|
+
const testCanvas = document.createElement("canvas");
|
|
15776
|
+
const contextNames = [
|
|
15777
|
+
"webgl",
|
|
15778
|
+
"experimental-webgl",
|
|
15779
|
+
"webkit-3d",
|
|
15780
|
+
"moz-webgl"
|
|
15781
|
+
];
|
|
15782
|
+
let gl = null;
|
|
15783
|
+
for (const name of contextNames) {
|
|
15784
|
+
try {
|
|
15785
|
+
gl = testCanvas.getContext(name);
|
|
15786
|
+
if (gl)
|
|
15787
|
+
break;
|
|
15788
|
+
} catch (_) {
|
|
15789
|
+
}
|
|
15790
|
+
}
|
|
15791
|
+
if (gl) {
|
|
15792
|
+
const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
|
|
15793
|
+
if (debugInfo) {
|
|
15794
|
+
const renderer2 = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
|
|
15795
|
+
if (renderer2 && /llvmpipe|software/i.test(renderer2)) {
|
|
15796
|
+
gl = null;
|
|
15797
|
+
}
|
|
15798
|
+
}
|
|
15799
|
+
}
|
|
15800
|
+
_webgl1Supported = !!gl;
|
|
15801
|
+
_webgl1Checked = true;
|
|
15802
|
+
return _webgl1Supported;
|
|
15803
|
+
};
|
|
15804
|
+
let _canvas2dChecked = false;
|
|
15805
|
+
let _canvas2dSupported = false;
|
|
15737
15806
|
const isCanvas2DSupported = (canvas) => {
|
|
15738
|
-
|
|
15739
|
-
|
|
15740
|
-
|
|
15807
|
+
if (_canvas2dChecked)
|
|
15808
|
+
return _canvas2dSupported;
|
|
15809
|
+
const testCanvas = document.createElement("canvas");
|
|
15810
|
+
let ctx = null;
|
|
15811
|
+
try {
|
|
15812
|
+
ctx = testCanvas.getContext("2d", {
|
|
15813
|
+
// 防止某些极端隐私模式下返回 null
|
|
15814
|
+
alpha: true,
|
|
15815
|
+
desynchronized: false
|
|
15816
|
+
});
|
|
15817
|
+
} catch (_) {
|
|
15818
|
+
ctx = null;
|
|
15819
|
+
}
|
|
15820
|
+
if (ctx && typeof ctx.fillRect === "function") {
|
|
15821
|
+
_canvas2dSupported = true;
|
|
15822
|
+
} else {
|
|
15823
|
+
_canvas2dSupported = false;
|
|
15824
|
+
}
|
|
15825
|
+
_canvas2dChecked = true;
|
|
15826
|
+
return _canvas2dSupported;
|
|
15827
|
+
};
|
|
15828
|
+
const detectRenderingCapabilities = async () => {
|
|
15829
|
+
const [webgpu, webgl2, webgl1, canvas2d] = await Promise.all([
|
|
15830
|
+
isWebGPUSupported(),
|
|
15831
|
+
Promise.resolve(isWebGL2Supported()),
|
|
15832
|
+
Promise.resolve(isWebGL1Supported()),
|
|
15833
|
+
Promise.resolve(isCanvas2DSupported())
|
|
15834
|
+
]);
|
|
15835
|
+
return {
|
|
15836
|
+
webgpu,
|
|
15837
|
+
webgl2,
|
|
15838
|
+
webgl1,
|
|
15839
|
+
canvas2d,
|
|
15840
|
+
// 推荐的降级顺序
|
|
15841
|
+
best: webgpu ? "webgpu" : webgl2 ? "webgl2" : webgl1 ? "webgl1" : canvas2d ? "canvas2d" : "none"
|
|
15842
|
+
};
|
|
15741
15843
|
};
|
|
15742
15844
|
const _WebGLRenderer = class _WebGLRenderer {
|
|
15743
15845
|
constructor(type, canvas) {
|
|
@@ -17493,24 +17595,26 @@ function useRemoteVideo(videoContainer, remoteVideoElement, audioElement, videoA
|
|
|
17493
17595
|
await initRender(video);
|
|
17494
17596
|
};
|
|
17495
17597
|
const initRender = async (video) => {
|
|
17598
|
+
const caps = await detectRenderingCapabilities();
|
|
17599
|
+
console.log("caps", caps);
|
|
17496
17600
|
if (isWebCodec.value) {
|
|
17497
|
-
if (
|
|
17601
|
+
if (caps.webgpu) {
|
|
17498
17602
|
webRenderer.value = new WebGPURenderer(video);
|
|
17499
17603
|
console.log("支持====>webGpu");
|
|
17500
|
-
} else if (
|
|
17604
|
+
} else if (caps.webgl2) {
|
|
17501
17605
|
webRenderer.value = new WebGLRenderer("webgl2", video);
|
|
17502
17606
|
console.log("支持====>webgl2");
|
|
17503
|
-
} else if (
|
|
17607
|
+
} else if (caps.webgl1) {
|
|
17504
17608
|
webRenderer.value = new WebGLRenderer("webgl", video);
|
|
17505
17609
|
console.log("支持====>webgl");
|
|
17506
|
-
} else if (
|
|
17610
|
+
} else if (caps.canvas2d) {
|
|
17507
17611
|
webRenderer.value = new Canvas2DRenderer(video);
|
|
17508
17612
|
console.log("支持====>Canvas2D");
|
|
17509
17613
|
} else {
|
|
17510
17614
|
console.log("error====>不支持");
|
|
17511
17615
|
}
|
|
17512
17616
|
} else {
|
|
17513
|
-
if (
|
|
17617
|
+
if (caps.webgpu) {
|
|
17514
17618
|
wasmRenderer.value = new WebGPUDefault8Render(video, {
|
|
17515
17619
|
renderMode: 0,
|
|
17516
17620
|
devicePixelRatio: window.devicePixelRatio
|
|
@@ -17518,7 +17622,7 @@ function useRemoteVideo(videoContainer, remoteVideoElement, audioElement, videoA
|
|
|
17518
17622
|
await wasmRenderer.value.init();
|
|
17519
17623
|
wasmRenderer.value.viewport(video.offsetWidth, video.offsetHeight);
|
|
17520
17624
|
console.log("支持====>WebGPUDefault8Render");
|
|
17521
|
-
} else if (
|
|
17625
|
+
} else if (caps.webgl2 || caps.webgl1) {
|
|
17522
17626
|
wasmRenderer.value = new WebGLDefault8Render(video, {
|
|
17523
17627
|
renderMode: 0,
|
|
17524
17628
|
devicePixelRatio: window.devicePixelRatio
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yjz-web-sdk",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.0.9-beta.
|
|
4
|
+
"version": "1.0.9-beta.3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "针对于亚矩阵项目的云手机投屏和屏幕控制",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
|
-
"main": "lib/yjz-web-sdk.
|
|
8
|
+
"main": "lib/yjz-web-sdk.js",
|
|
9
9
|
"module": "lib/yjz-web-sdk.js",
|
|
10
10
|
"types": "./lib/index.d.ts",
|
|
11
11
|
"exports": {
|
|
12
12
|
".": {
|
|
13
13
|
"import": "./lib/yjz-web-sdk.js",
|
|
14
|
-
"require": "./lib/yjz-web-sdk.
|
|
14
|
+
"require": "./lib/yjz-web-sdk.js",
|
|
15
15
|
"types": [
|
|
16
16
|
"./lib/index.d.ts"
|
|
17
17
|
]
|