@yimou6/common-ui 1.14.1 → 1.14.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.
Files changed (45) hide show
  1. package/cdn/index.cdn.js +16 -16
  2. package/cdn/index.cdn.js.map +1 -1
  3. package/cdn/index.cdn.mjs +16 -16
  4. package/cdn/index.cdn.mjs.map +1 -1
  5. package/cdn/index.css +1 -1
  6. package/es/components/index.mjs +1 -1
  7. package/es/components/tzj-player/index.d.ts +285 -6
  8. package/es/components/tzj-player/index.mjs +1 -1
  9. package/es/components/tzj-player/src/ctyun-player.mjs +9 -4
  10. package/es/components/tzj-player/src/ctyun-player.mjs.map +1 -1
  11. package/es/components/tzj-player/src/ctyun-player.vue2.mjs +6 -122
  12. package/es/components/tzj-player/src/ctyun-player.vue2.mjs.map +1 -1
  13. package/es/components/tzj-player/src/easyPlayer.vue2.mjs +23 -5
  14. package/es/components/tzj-player/src/easyPlayer.vue2.mjs.map +1 -1
  15. package/es/components/tzj-player/src/tzj-player.vue.d.ts +285 -6
  16. package/es/components/tzj-player/src/yunzhiyan.d.ts +0 -15
  17. package/es/components/tzj-player/src/yunzhiyan.mjs +1 -215
  18. package/es/components/tzj-player/src/yunzhiyan.mjs.map +1 -1
  19. package/es/components/tzj-player/src/yunzhiyanPlayer.vue.d.ts +0 -6
  20. package/es/components/tzj-player/src/yunzhiyanPlayer.vue2.mjs +6 -144
  21. package/es/components/tzj-player/src/yunzhiyanPlayer.vue2.mjs.map +1 -1
  22. package/es/index.mjs +1 -1
  23. package/lib/components/index.js +0 -4
  24. package/lib/components/index.js.map +1 -1
  25. package/lib/components/tzj-player/index.d.ts +285 -6
  26. package/lib/components/tzj-player/index.js +0 -4
  27. package/lib/components/tzj-player/index.js.map +1 -1
  28. package/lib/components/tzj-player/src/ctyun-player.js +9 -4
  29. package/lib/components/tzj-player/src/ctyun-player.js.map +1 -1
  30. package/lib/components/tzj-player/src/ctyun-player.vue2.js +5 -121
  31. package/lib/components/tzj-player/src/ctyun-player.vue2.js.map +1 -1
  32. package/lib/components/tzj-player/src/easyPlayer.vue2.js +23 -5
  33. package/lib/components/tzj-player/src/easyPlayer.vue2.js.map +1 -1
  34. package/lib/components/tzj-player/src/tzj-player.vue.d.ts +285 -6
  35. package/lib/components/tzj-player/src/yunzhiyan.d.ts +0 -15
  36. package/lib/components/tzj-player/src/yunzhiyan.js +0 -218
  37. package/lib/components/tzj-player/src/yunzhiyan.js.map +1 -1
  38. package/lib/components/tzj-player/src/yunzhiyanPlayer.vue.d.ts +0 -6
  39. package/lib/components/tzj-player/src/yunzhiyanPlayer.vue2.js +5 -143
  40. package/lib/components/tzj-player/src/yunzhiyanPlayer.vue2.js.map +1 -1
  41. package/lib/index.js +0 -4
  42. package/lib/index.js.map +1 -1
  43. package/package.json +1 -1
  44. package/theme-default/i-tzj-player.css +1 -1
  45. package/theme-default/index.css +1 -1
@@ -134,7 +134,6 @@ export declare const ITzjPlayer: import("../../types").SFCWithInstall<import("vu
134
134
  showBottomBar: import("vue").Ref<boolean, boolean>;
135
135
  playerRef: import("vue").ShallowRef<any, any>;
136
136
  isPlaying: import("vue").Ref<boolean, boolean>;
137
- isFullscreen: import("vue").Ref<boolean, boolean>;
138
137
  isVolumeMuted: import("vue").Ref<boolean, boolean>;
139
138
  audioMsg: import("vue").Ref<{
140
139
  type: string;
@@ -147,13 +146,8 @@ export declare const ITzjPlayer: import("../../types").SFCWithInstall<import("vu
147
146
  msg: string;
148
147
  }>;
149
148
  initPlayer: () => Promise<void>;
150
- playerPlay: () => void;
151
- playerPause: () => void;
152
- playerScreenShot: () => void;
153
- playerFullscreen: (fullscreen: boolean) => void;
154
149
  handleVideoInfo: () => void;
155
150
  handleMute: (mute: boolean) => void;
156
- handleSetMute: (volume: number) => void;
157
151
  EasyPlayer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
158
152
  url: {
159
153
  type: StringConstructor;
@@ -880,6 +874,291 @@ export declare const ITzjPlayer: import("../../types").SFCWithInstall<import("vu
880
874
  areaName: string;
881
875
  platformTypeName: string;
882
876
  pauseMode: number;
877
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any> | import("vue").DefineComponent<import("vue").ExtractPropTypes<{
878
+ url: {
879
+ type: StringConstructor;
880
+ default: string;
881
+ };
882
+ accessToken: {
883
+ type: StringConstructor;
884
+ default: string;
885
+ };
886
+ areaName: {
887
+ type: StringConstructor;
888
+ default: string;
889
+ };
890
+ deviceSerial: {
891
+ type: StringConstructor;
892
+ default: string;
893
+ };
894
+ platformTypeName: {
895
+ type: StringConstructor;
896
+ default: string;
897
+ };
898
+ debug: {
899
+ type: BooleanConstructor;
900
+ default: boolean;
901
+ };
902
+ pauseMode: {
903
+ type: NumberConstructor;
904
+ default: number;
905
+ validator: (value: number) => boolean;
906
+ };
907
+ }>, {
908
+ props: import("@vue/shared").LooseRequired<Readonly<import("vue").ExtractPropTypes<{
909
+ url: {
910
+ type: StringConstructor;
911
+ default: string;
912
+ };
913
+ accessToken: {
914
+ type: StringConstructor;
915
+ default: string;
916
+ };
917
+ areaName: {
918
+ type: StringConstructor;
919
+ default: string;
920
+ };
921
+ deviceSerial: {
922
+ type: StringConstructor;
923
+ default: string;
924
+ };
925
+ platformTypeName: {
926
+ type: StringConstructor;
927
+ default: string;
928
+ };
929
+ debug: {
930
+ type: BooleanConstructor;
931
+ default: boolean;
932
+ };
933
+ pauseMode: {
934
+ type: NumberConstructor;
935
+ default: number;
936
+ validator: (value: number) => boolean;
937
+ };
938
+ }>> & Readonly<{}> & {}>;
939
+ videoUrl: import("vue").Ref<string, string>;
940
+ errorMsg: import("vue").Ref<string, string>;
941
+ showBottomBar: import("vue").Ref<boolean, boolean>;
942
+ playerRef: import("vue").ShallowRef<any, any>;
943
+ isPlaying: import("vue").Ref<boolean, boolean>;
944
+ isVolumeMuted: import("vue").Ref<boolean, boolean>;
945
+ audioMsg: import("vue").Ref<{
946
+ type: string;
947
+ msg: string;
948
+ }, {
949
+ type: string;
950
+ msg: string;
951
+ } | {
952
+ type: string;
953
+ msg: string;
954
+ }>;
955
+ initPlayer: () => Promise<void>;
956
+ handleVideoInfo: () => void;
957
+ handleMute: (mute: boolean) => void;
958
+ EasyPlayer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
959
+ url: {
960
+ type: StringConstructor;
961
+ default: string;
962
+ };
963
+ accessToken: {
964
+ type: StringConstructor;
965
+ default: string;
966
+ };
967
+ areaName: {
968
+ type: StringConstructor;
969
+ default: string;
970
+ };
971
+ deviceSerial: {
972
+ type: StringConstructor;
973
+ default: string;
974
+ };
975
+ platformTypeName: {
976
+ type: StringConstructor;
977
+ default: string;
978
+ };
979
+ debug: {
980
+ type: BooleanConstructor;
981
+ default: boolean;
982
+ };
983
+ pauseMode: {
984
+ type: NumberConstructor;
985
+ default: number;
986
+ validator: (value: number) => boolean;
987
+ };
988
+ }>, {
989
+ props: import("@vue/shared").LooseRequired<Readonly<import("vue").ExtractPropTypes<{
990
+ url: {
991
+ type: StringConstructor;
992
+ default: string;
993
+ };
994
+ accessToken: {
995
+ type: StringConstructor;
996
+ default: string;
997
+ };
998
+ areaName: {
999
+ type: StringConstructor;
1000
+ default: string;
1001
+ };
1002
+ deviceSerial: {
1003
+ type: StringConstructor;
1004
+ default: string;
1005
+ };
1006
+ platformTypeName: {
1007
+ type: StringConstructor;
1008
+ default: string;
1009
+ };
1010
+ debug: {
1011
+ type: BooleanConstructor;
1012
+ default: boolean;
1013
+ };
1014
+ pauseMode: {
1015
+ type: NumberConstructor;
1016
+ default: number;
1017
+ validator: (value: number) => boolean;
1018
+ };
1019
+ }>> & Readonly<{
1020
+ onPlay?: ((...args: any[]) => any) | undefined;
1021
+ onPause?: ((...args: any[]) => any) | undefined;
1022
+ onError?: ((...args: any[]) => any) | undefined;
1023
+ onVideoInfo?: ((...args: any[]) => any) | undefined;
1024
+ onTimeout?: ((...args: any[]) => any) | undefined;
1025
+ onMute?: ((...args: any[]) => any) | undefined;
1026
+ }> & {}>;
1027
+ emits: (event: "error" | "play" | "pause" | "videoInfo" | "timeout" | "mute", ...args: any[]) => void;
1028
+ slots: Readonly<{
1029
+ [name: string]: import("vue").Slot<any> | undefined;
1030
+ }>;
1031
+ customBar: import("vue").ComputedRef<import("vue").Slot<any> | undefined>;
1032
+ player: any;
1033
+ id: string;
1034
+ playerRef: import("vue").ShallowRef<HTMLDivElement | undefined, HTMLDivElement | undefined>;
1035
+ playSuccess: import("vue").Ref<boolean, boolean>;
1036
+ playUrl: import("vue").Ref<string, string>;
1037
+ videoInfo: import("vue").Ref<any, any>;
1038
+ eventHandlers: import("vue").Ref<Map<string, Function> & Omit<Map<string, Function>, keyof Map<any, any>>, Map<string, Function> | (Map<string, Function> & Omit<Map<string, Function>, keyof Map<any, any>>)>;
1039
+ waitTimer: number | null;
1040
+ restartTimer: import("vue").Ref<number | null, number | null>;
1041
+ pauseCycleTimer: import("vue").Ref<number | null, number | null>;
1042
+ resizeObserver: ResizeObserver | null;
1043
+ createRetryCount: number;
1044
+ MAX_CREATE_RETRY: number;
1045
+ isUnmounted: boolean;
1046
+ play: (url?: string) => void;
1047
+ playerPause: () => void;
1048
+ playerScreenShot: () => void;
1049
+ formatUrl: (url: string) => string;
1050
+ initPlayer: (url: string) => Promise<void>;
1051
+ removePlayerDom: () => void;
1052
+ createPlayerDom: () => Promise<HTMLDivElement>;
1053
+ createPlayer: () => Promise<void>;
1054
+ startPlayer: () => Promise<void>;
1055
+ destroy: (flag?: boolean) => void;
1056
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("error" | "play" | "pause" | "videoInfo" | "timeout" | "mute")[], "error" | "play" | "pause" | "videoInfo" | "timeout" | "mute", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
1057
+ url: {
1058
+ type: StringConstructor;
1059
+ default: string;
1060
+ };
1061
+ accessToken: {
1062
+ type: StringConstructor;
1063
+ default: string;
1064
+ };
1065
+ areaName: {
1066
+ type: StringConstructor;
1067
+ default: string;
1068
+ };
1069
+ deviceSerial: {
1070
+ type: StringConstructor;
1071
+ default: string;
1072
+ };
1073
+ platformTypeName: {
1074
+ type: StringConstructor;
1075
+ default: string;
1076
+ };
1077
+ debug: {
1078
+ type: BooleanConstructor;
1079
+ default: boolean;
1080
+ };
1081
+ pauseMode: {
1082
+ type: NumberConstructor;
1083
+ default: number;
1084
+ validator: (value: number) => boolean;
1085
+ };
1086
+ }>> & Readonly<{
1087
+ onPlay?: ((...args: any[]) => any) | undefined;
1088
+ onPause?: ((...args: any[]) => any) | undefined;
1089
+ onError?: ((...args: any[]) => any) | undefined;
1090
+ onVideoInfo?: ((...args: any[]) => any) | undefined;
1091
+ onTimeout?: ((...args: any[]) => any) | undefined;
1092
+ onMute?: ((...args: any[]) => any) | undefined;
1093
+ }>, {
1094
+ url: string;
1095
+ accessToken: string;
1096
+ debug: boolean;
1097
+ deviceSerial: string;
1098
+ areaName: string;
1099
+ platformTypeName: string;
1100
+ pauseMode: number;
1101
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
1102
+ ErrorPage: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
1103
+ videoName: {
1104
+ type: StringConstructor;
1105
+ default: string;
1106
+ };
1107
+ message: {
1108
+ type: StringConstructor;
1109
+ default: string;
1110
+ };
1111
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
1112
+ videoName: {
1113
+ type: StringConstructor;
1114
+ default: string;
1115
+ };
1116
+ message: {
1117
+ type: StringConstructor;
1118
+ default: string;
1119
+ };
1120
+ }>> & Readonly<{}>, {
1121
+ message: string;
1122
+ videoName: string;
1123
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
1124
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
1125
+ url: {
1126
+ type: StringConstructor;
1127
+ default: string;
1128
+ };
1129
+ accessToken: {
1130
+ type: StringConstructor;
1131
+ default: string;
1132
+ };
1133
+ areaName: {
1134
+ type: StringConstructor;
1135
+ default: string;
1136
+ };
1137
+ deviceSerial: {
1138
+ type: StringConstructor;
1139
+ default: string;
1140
+ };
1141
+ platformTypeName: {
1142
+ type: StringConstructor;
1143
+ default: string;
1144
+ };
1145
+ debug: {
1146
+ type: BooleanConstructor;
1147
+ default: boolean;
1148
+ };
1149
+ pauseMode: {
1150
+ type: NumberConstructor;
1151
+ default: number;
1152
+ validator: (value: number) => boolean;
1153
+ };
1154
+ }>> & Readonly<{}>, {
1155
+ url: string;
1156
+ accessToken: string;
1157
+ debug: boolean;
1158
+ deviceSerial: string;
1159
+ areaName: string;
1160
+ platformTypeName: string;
1161
+ pauseMode: number;
883
1162
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any> | import("vue").DefineComponent<import("vue").ExtractPropTypes<{
884
1163
  url: {
885
1164
  type: StringConstructor;
@@ -1,6 +1,6 @@
1
1
  import '../../utils/index.mjs';
2
2
  import './src/tzj-player.vue.mjs';
3
- export { ApiEnroll, GetYunZhiYanDeviceChannel, GetYunZhiYanDeviceVideoUrl, getVideoUrlByCamreaId, parseAuthorizedTokenCookie, sign } from './src/yunzhiyan.mjs';
3
+ export { getVideoUrlByCamreaId, parseAuthorizedTokenCookie } from './src/yunzhiyan.mjs';
4
4
  import { withInstall } from '../../utils/install.mjs';
5
5
  import _sfc_main from './src/tzj-player.vue2.mjs';
6
6
 
@@ -5,16 +5,16 @@ var __defProp = Object.defineProperty;
5
5
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
6
  function getAccessKey() {
7
7
  if (typeof localStorage !== "undefined") {
8
- return localStorage.getItem("CTYUNAK") || "9XCW5FIP7RX85ZZ9FJDD";
8
+ return localStorage.getItem("CTYUNAK") || "";
9
9
  }
10
- return "9XCW5FIP7RX85ZZ9FJDD";
10
+ return "";
11
11
  }
12
12
  __name(getAccessKey, "getAccessKey");
13
13
  function getSecretKey() {
14
14
  if (typeof localStorage !== "undefined") {
15
- return localStorage.getItem("CTYUNSK") || "qTBbJjIo8RZmDMqAN7OQlg1O13j6R5OjYx40nLrK";
15
+ return localStorage.getItem("CTYUNSK") || "";
16
16
  }
17
- return "qTBbJjIo8RZmDMqAN7OQlg1O13j6R5OjYx40nLrK";
17
+ return "";
18
18
  }
19
19
  __name(getSecretKey, "getSecretKey");
20
20
  const AK = getAccessKey();
@@ -52,6 +52,11 @@ ${HashedRequestPayload}`;
52
52
  ${RequestTimestamp}
53
53
  ${CredentialScope}
54
54
  ${HashedCanonicalRequest}`;
55
+ if (!AK || !SK) {
56
+ console.warn(
57
+ "[tzj-player] \u5929\u7FFC\u4E91\u7B7E\u540D\u5BC6\u94A5 CTYUNAK / CTYUNSK \u4E3A\u7A7A\uFF0C\u7B7E\u540D\u7ED3\u679C\u5C06\u4E0D\u88AB\u670D\u52A1\u7AEF\u8BA4\u53EF\uFF0C\u8BF7\u786E\u8BA4\u5DF2\u5199\u5165 localStorage"
58
+ );
59
+ }
55
60
  const dateString = formatTimestamp(timestamp);
56
61
  const secretKey = `CT${SK}`;
57
62
  const SecretDate = CryptoJS.HmacSHA256(dateString, secretKey);
@@ -1 +1 @@
1
- {"version":3,"file":"ctyun-player.mjs","sources":["../../../../../../../packages/components/tzj-player/src/ctyun-player.ts"],"sourcesContent":["import axios from \"axios\";\nimport CryptoJS from \"crypto-js\";\n\n/**\n * 获取访问密钥,支持 SSR 环境\n */\nfunction getAccessKey(): string {\n if (typeof localStorage !== \"undefined\") {\n return localStorage.getItem(\"CTYUNAK\") || \"9XCW5FIP7RX85ZZ9FJDD\";\n }\n return \"9XCW5FIP7RX85ZZ9FJDD\";\n}\n\n/**\n * 获取签名密钥,支持 SSR 环境\n */\nfunction getSecretKey(): string {\n if (typeof localStorage !== \"undefined\") {\n return (\n localStorage.getItem(\"CTYUNSK\") ||\n \"qTBbJjIo8RZmDMqAN7OQlg1O13j6R5OjYx40nLrK\"\n );\n }\n return \"qTBbJjIo8RZmDMqAN7OQlg1O13j6R5OjYx40nLrK\";\n}\n\nconst AK = getAccessKey();\nconst SK = getSecretKey();\n\n/**\n * 获取UNIX时间戳,精确到秒\n */\nfunction getUnixTimestamp() {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * 将UNIX时间戳转成YYYY-MM-DD格式\n */\nfunction formatTimestamp(timestamp: number) {\n const date = new Date(timestamp * 1000);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * 拼接规范请求串\n * @param HTTPRequestMethod 请求方法\n * @param CanonicalURI 请求 URI\n * @param CanonicalQueryString 请求参数\n * @param CanonicalHeaders\n * @param SignedHeaders\n * @param body 请求体\n * @param timestamp 时间戳\n */\nfunction sign(\n HTTPRequestMethod: \"GET\" | \"POST\",\n CanonicalURI: string,\n CanonicalQueryString: string = \"\",\n CanonicalHeaders: string | Record<string, any> = \"\",\n SignedHeaders: string | number = \"\",\n body: Record<string, any> | null,\n timestamp: number,\n) {\n // 拼接规范请求串\n const HashedRequestPayload = CryptoJS.SHA256(\n body ? JSON.stringify(body) : \"\",\n ).toString(CryptoJS.enc.Hex);\n const CanonicalRequest = `${HTTPRequestMethod}\\n${CanonicalURI}\\n${CanonicalQueryString}\\n${CanonicalHeaders}\\n\\n${SignedHeaders}\\n${\n HashedRequestPayload\n }`;\n // console.log(\"\\n--- CanonicalRequest ---\");\n // console.log(CanonicalRequest);\n\n // 拼接待签名字符串\n const Algorithm = \"CT-HMAC-SHA256\";\n const RequestTimestamp = timestamp;\n const CredentialScope = `${formatTimestamp(timestamp)}/vss`;\n const HashedCanonicalRequest = CryptoJS.SHA256(CanonicalRequest).toString(\n CryptoJS.enc.Hex,\n );\n const StringToSign = `${Algorithm}\\n${RequestTimestamp}\\n${CredentialScope}\\n${HashedCanonicalRequest}`;\n // console.log(\"\\n--- StringToSign ---\");\n // console.log(StringToSign);\n\n // 计算签名\n // 第一步:计算SecretDate\n const dateString = formatTimestamp(timestamp);\n const secretKey = `CT${SK}`;\n const SecretDate = CryptoJS.HmacSHA256(dateString, secretKey);\n // console.log(\"\\n--- SecretDate ---\");\n // console.log(SecretDate.toString(CryptoJS.enc.Hex));\n\n // 第二步:计算SigningKey\n const SigningKey = CryptoJS.HmacSHA256(\"vss\", SecretDate);\n // console.log(\"\\n--- SigningKey ---\");\n // console.log(SigningKey.toString(CryptoJS.enc.Hex));\n\n // 第三步:计算最终签名\n const Signature = CryptoJS.HmacSHA256(StringToSign, SigningKey).toString(\n CryptoJS.enc.Hex,\n );\n // console.log(\"\\n--- Signature ---\");\n // console.log(Signature);\n\n // 构建Authorization头\n return `${Algorithm} Credential=${AK}/${CredentialScope}, SignedHeaders=${SignedHeaders}, Signature=${Signature}`;\n}\n\nexport async function ctyunRequest(\n method: \"GET\" | \"POST\",\n url: string,\n params?: {\n query?: Record<string, any> | null;\n body?: Record<string, any> | null;\n },\n): Promise<any> {\n const timestamp = getUnixTimestamp();\n // const timestamp = 1756374060;\n let queryString = \"\";\n let uri = url;\n if (params && params?.query) {\n const temp = params.query;\n queryString = Object.keys(temp)\n .map((key) => `${key}=${temp[key]}`)\n .join(\"&\");\n uri = `${uri}?${queryString}`;\n }\n const Authorization = sign(\n method,\n url,\n queryString,\n `host:vssapi.ctyun.cn\\ntimestamp:${timestamp}`,\n \"host;timestamp\",\n params?.body || null,\n timestamp,\n );\n return new Promise((resolve, reject) => {\n axios({\n method,\n url: `/ctyun${uri}`,\n headers: {\n Authorization,\n Version: \"2021-11-25\",\n Timestamp: timestamp,\n },\n data: params?.body,\n })\n .then((res) => {\n // console.log(res);\n resolve(res.data);\n })\n .catch((err) => {\n // console.log(err);\n if (err.status === 403) {\n resolve(err.response?.data);\n } else {\n reject(err.response?.data);\n }\n });\n });\n}\n\n/**\n * 通过设备ID获取播放流地址\n */\nexport async function GetCtyunDeviceVideoUrl(\n deviceId: string,\n): Promise<string> {\n try {\n // 参数校验\n if (!deviceId) {\n console.warn(\"Device ID is required\");\n return \"\";\n }\n\n const result = await ctyunRequest(\n \"GET\",\n `/devices/${deviceId}/live/stream`,\n {\n query: {\n StreamNum: 1,\n },\n },\n );\n console.log(result);\n // 检查响应状态\n if (!result || result.statusCode !== 200) {\n console.error(\"Failed to get device video stream\", result);\n return \"\";\n }\n\n // 安全地提取播放URL\n const liveStream = result.returnObj?.LiveStreams?.[0];\n const flvUrl = liveStream?.PlayUrl?.FlvUrl;\n\n console.log(flvUrl);\n if (flvUrl) {\n return flvUrl;\n }\n\n console.warn(\"No FLV URL found in response\", result);\n return \"\";\n } catch (error) {\n console.error(\"Error getting device video URL:\", error);\n return \"\";\n }\n}\n\n/**\n * 获取语音对讲WebSocket地址\n */\nexport async function GetCtyunDeviceAudioUrl(deviceId: string): Promise<any> {\n try {\n // 参数校验\n if (!deviceId) {\n console.warn(\"Device ID is required\");\n return {};\n }\n\n const result = await ctyunRequest(\n \"POST\",\n `/devices/${deviceId}/startTalk`,\n {\n body: {\n // 传输优先级 tcp/udp\n TransPriority: \"tcp\",\n // 接入协议\n InProtocol: \"gb28181\",\n },\n },\n );\n console.log(result);\n // 检查响应状态\n if (!result || result.statusCode !== 200) {\n console.error(\"Failed to get device audio stream\", result);\n return {};\n }\n if (result?.returnObj) {\n return result?.returnObj;\n }\n\n console.warn(\"No FLV URL found in response\", result);\n return {\n audioUrl: \"\",\n audioKey: \"\",\n };\n } catch (error) {\n console.error(\"Error getting device audio URL:\", error);\n return {\n audioUrl: \"\",\n audioKey: \"\",\n };\n }\n}\n"],"names":[],"mappings":";;;;;AAMA,SAAS,YAAuB,GAAA;AAC9B,EAAI,IAAA,OAAO,iBAAiB,WAAa,EAAA;AACvC,IAAO,OAAA,YAAA,CAAa,OAAQ,CAAA,SAAS,CAAK,IAAA,sBAAA;AAAA;AAE5C,EAAO,OAAA,sBAAA;AACT;AALS,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAUT,SAAS,YAAuB,GAAA;AAC9B,EAAI,IAAA,OAAO,iBAAiB,WAAa,EAAA;AACvC,IACE,OAAA,YAAA,CAAa,OAAQ,CAAA,SAAS,CAC9B,IAAA,0CAAA;AAAA;AAGJ,EAAO,OAAA,0CAAA;AACT;AARS,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAUT,MAAM,KAAK,YAAa,EAAA;AACxB,MAAM,KAAK,YAAa,EAAA;AAKxB,SAAS,gBAAmB,GAAA;AAC1B,EAAA,OAAO,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,KAAQ,GAAI,CAAA;AACrC;AAFS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAOT,SAAS,gBAAgB,SAAmB,EAAA;AAC1C,EAAA,MAAM,IAAO,GAAA,IAAI,IAAK,CAAA,SAAA,GAAY,GAAI,CAAA;AACtC,EAAM,MAAA,IAAA,GAAO,KAAK,WAAY,EAAA;AAC9B,EAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAA,QAAA,KAAa,CAAC,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,GAAG,CAAA;AACzD,EAAM,MAAA,GAAA,GAAM,OAAO,IAAK,CAAA,OAAA,EAAS,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AAClD,EAAA,OAAO,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,KAAK,IAAI,GAAG,CAAA,CAAA;AAChC;AANS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAkBT,SAAS,IAAA,CACP,iBACA,EAAA,YAAA,EACA,oBAA+B,GAAA,EAAA,EAC/B,mBAAiD,EACjD,EAAA,aAAA,GAAiC,EACjC,EAAA,IAAA,EACA,SACA,EAAA;AAEA,EAAA,MAAM,uBAAuB,QAAS,CAAA,MAAA;AAAA,IACpC,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAI,GAAA;AAAA,GAC9B,CAAA,QAAA,CAAS,QAAS,CAAA,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAM,MAAA,gBAAA,GAAmB,GAAG,iBAAiB;AAAA,EAAK,YAAY;AAAA,EAAK,oBAAoB;AAAA,EAAK,gBAAgB;;AAAA,EAAO,aAAa;AAAA,EAC9H,oBACF,CAAA,CAAA;AAKA,EAAA,MAAM,SAAY,GAAA,gBAAA;AAClB,EAAA,MAAM,gBAAmB,GAAA,SAAA;AACzB,EAAA,MAAM,eAAkB,GAAA,CAAA,EAAG,eAAgB,CAAA,SAAS,CAAC,CAAA,IAAA,CAAA;AACrD,EAAA,MAAM,sBAAyB,GAAA,QAAA,CAAS,MAAO,CAAA,gBAAgB,CAAE,CAAA,QAAA;AAAA,IAC/D,SAAS,GAAI,CAAA;AAAA,GACf;AACA,EAAM,MAAA,YAAA,GAAe,GAAG,SAAS;AAAA,EAAK,gBAAgB;AAAA,EAAK,eAAe;AAAA,EAAK,sBAAsB,CAAA,CAAA;AAMrG,EAAM,MAAA,UAAA,GAAa,gBAAgB,SAAS,CAAA;AAC5C,EAAM,MAAA,SAAA,GAAY,KAAK,EAAE,CAAA,CAAA;AACzB,EAAA,MAAM,UAAa,GAAA,QAAA,CAAS,UAAW,CAAA,UAAA,EAAY,SAAS,CAAA;AAK5D,EAAA,MAAM,UAAa,GAAA,QAAA,CAAS,UAAW,CAAA,KAAA,EAAO,UAAU,CAAA;AAKxD,EAAA,MAAM,SAAY,GAAA,QAAA,CAAS,UAAW,CAAA,YAAA,EAAc,UAAU,CAAE,CAAA,QAAA;AAAA,IAC9D,SAAS,GAAI,CAAA;AAAA,GACf;AAKA,EAAO,OAAA,CAAA,EAAG,SAAS,CAAe,YAAA,EAAA,EAAE,IAAI,eAAe,CAAA,gBAAA,EAAmB,aAAa,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA;AACjH;AApDS,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAsDa,eAAA,YAAA,CACpB,MACA,EAAA,GAAA,EACA,MAIc,EAAA;AACd,EAAA,MAAM,YAAY,gBAAiB,EAAA;AAEnC,EAAA,IAAI,WAAc,GAAA,EAAA;AAClB,EAAA,IAAI,GAAM,GAAA,GAAA;AACV,EAAI,IAAA,MAAA,KAAU,iCAAQ,KAAO,CAAA,EAAA;AAC3B,IAAA,MAAM,OAAO,MAAO,CAAA,KAAA;AACpB,IAAA,WAAA,GAAc,OAAO,IAAK,CAAA,IAAI,CAC3B,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,CAAC,CAAE,CAAA,CAAA,CAClC,KAAK,GAAG,CAAA;AACX,IAAM,GAAA,GAAA,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA;AAE7B,EAAA,MAAM,aAAgB,GAAA,IAAA;AAAA,IACpB,MAAA;AAAA,IACA,GAAA;AAAA,IACA,WAAA;AAAA,IACA,CAAA;AAAA,UAAA,EAAmC,SAAS,CAAA,CAAA;AAAA,IAC5C,gBAAA;AAAA,IAAA,CACA,iCAAQ,IAAQ,KAAA,IAAA;AAAA,IAChB;AAAA,GACF;AACA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,IAAM,KAAA,CAAA;AAAA,MACJ,MAAA;AAAA,MACA,GAAA,EAAK,SAAS,GAAG,CAAA,CAAA;AAAA,MACjB,OAAS,EAAA;AAAA,QACP,aAAA;AAAA,QACA,OAAS,EAAA,YAAA;AAAA,QACT,SAAW,EAAA;AAAA,OACb;AAAA,MACA,MAAM,MAAQ,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA;AAAA,KACf,CAAA,CACE,IAAK,CAAA,CAAC,GAAQ,KAAA;AAEb,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,KACjB,CAAA,CACA,KAAM,CAAA,CAAC,GAAQ,KAAA;AA1JtB,MAAA,IAAA,EAAA,EAAA,EAAA;AA4JQ,MAAI,IAAA,GAAA,CAAI,WAAW,GAAK,EAAA;AACtB,QAAQ,OAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,IAAI,CAAA;AAAA,OACrB,MAAA;AACL,QAAO,MAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,IAAI,CAAA;AAAA;AAC3B,KACD,CAAA;AAAA,GACJ,CAAA;AACH;AApDsB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAyDtB,eAAsB,uBACpB,QACiB,EAAA;AA1KnB,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2KE,EAAI,IAAA;AAEF,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AACpC,MAAO,OAAA,EAAA;AAAA;AAGT,IAAA,MAAM,SAAS,MAAM,YAAA;AAAA,MACnB,KAAA;AAAA,MACA,YAAY,QAAQ,CAAA,YAAA,CAAA;AAAA,MACpB;AAAA,QACE,KAAO,EAAA;AAAA,UACL,SAAW,EAAA;AAAA;AACb;AACF,KACF;AACA,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAElB,IAAA,IAAI,CAAC,MAAA,IAAU,MAAO,CAAA,UAAA,KAAe,GAAK,EAAA;AACxC,MAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,MAAM,CAAA;AACzD,MAAO,OAAA,EAAA;AAAA;AAIT,IAAA,MAAM,UAAa,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,SAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,gBAAlB,IAAgC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AACnD,IAAM,MAAA,MAAA,GAAA,CAAS,EAAY,GAAA,UAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,UAAA,CAAA,OAAA,KAAZ,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA;AAEpC,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA,MAAA;AAAA;AAGT,IAAQ,OAAA,CAAA,IAAA,CAAK,gCAAgC,MAAM,CAAA;AACnD,IAAO,OAAA,EAAA;AAAA,WACA,KAAO,EAAA;AACd,IAAQ,OAAA,CAAA,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAO,OAAA,EAAA;AAAA;AAEX;AAzCsB,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AA8CtB,eAAsB,uBAAuB,QAAgC,EAAA;AAC3E,EAAI,IAAA;AAEF,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AACpC,MAAA,OAAO,EAAC;AAAA;AAGV,IAAA,MAAM,SAAS,MAAM,YAAA;AAAA,MACnB,MAAA;AAAA,MACA,YAAY,QAAQ,CAAA,UAAA,CAAA;AAAA,MACpB;AAAA,QACE,IAAM,EAAA;AAAA;AAAA,UAEJ,aAAe,EAAA,KAAA;AAAA;AAAA,UAEf,UAAY,EAAA;AAAA;AACd;AACF,KACF;AACA,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAElB,IAAA,IAAI,CAAC,MAAA,IAAU,MAAO,CAAA,UAAA,KAAe,GAAK,EAAA;AACxC,MAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,MAAM,CAAA;AACzD,MAAA,OAAO,EAAC;AAAA;AAEV,IAAA,IAAI,iCAAQ,SAAW,EAAA;AACrB,MAAA,OAAO,MAAQ,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,SAAA;AAAA;AAGjB,IAAQ,OAAA,CAAA,IAAA,CAAK,gCAAgC,MAAM,CAAA;AACnD,IAAO,OAAA;AAAA,MACL,QAAU,EAAA,EAAA;AAAA,MACV,QAAU,EAAA;AAAA,KACZ;AAAA,WACO,KAAO,EAAA;AACd,IAAQ,OAAA,CAAA,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAO,OAAA;AAAA,MACL,QAAU,EAAA,EAAA;AAAA,MACV,QAAU,EAAA;AAAA,KACZ;AAAA;AAEJ;AA1CsB,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;;;;"}
1
+ {"version":3,"file":"ctyun-player.mjs","sources":["../../../../../../../packages/components/tzj-player/src/ctyun-player.ts"],"sourcesContent":["import axios from \"axios\";\nimport CryptoJS from \"crypto-js\";\n\n/**\n * 获取访问密钥,支持 SSR 环境\n */\nfunction getAccessKey(): string {\n if (typeof localStorage !== \"undefined\") {\n return localStorage.getItem(\"CTYUNAK\") || \"\";\n }\n return \"\";\n}\n\n/**\n * 获取签名密钥,支持 SSR 环境\n */\nfunction getSecretKey(): string {\n if (typeof localStorage !== \"undefined\") {\n return localStorage.getItem(\"CTYUNSK\") || \"\";\n }\n return \"\";\n}\n\nconst AK = getAccessKey();\nconst SK = getSecretKey();\n\n/**\n * 获取UNIX时间戳,精确到秒\n */\nfunction getUnixTimestamp() {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * 将UNIX时间戳转成YYYY-MM-DD格式\n */\nfunction formatTimestamp(timestamp: number) {\n const date = new Date(timestamp * 1000);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * 拼接规范请求串\n * @param HTTPRequestMethod 请求方法\n * @param CanonicalURI 请求 URI\n * @param CanonicalQueryString 请求参数\n * @param CanonicalHeaders\n * @param SignedHeaders\n * @param body 请求体\n * @param timestamp 时间戳\n */\nfunction sign(\n HTTPRequestMethod: \"GET\" | \"POST\",\n CanonicalURI: string,\n CanonicalQueryString: string = \"\",\n CanonicalHeaders: string | Record<string, any> = \"\",\n SignedHeaders: string | number = \"\",\n body: Record<string, any> | null,\n timestamp: number,\n) {\n // 拼接规范请求串\n const HashedRequestPayload = CryptoJS.SHA256(\n body ? JSON.stringify(body) : \"\",\n ).toString(CryptoJS.enc.Hex);\n const CanonicalRequest = `${HTTPRequestMethod}\\n${CanonicalURI}\\n${CanonicalQueryString}\\n${CanonicalHeaders}\\n\\n${SignedHeaders}\\n${\n HashedRequestPayload\n }`;\n // console.log(\"\\n--- CanonicalRequest ---\");\n // console.log(CanonicalRequest);\n\n // 拼接待签名字符串\n const Algorithm = \"CT-HMAC-SHA256\";\n const RequestTimestamp = timestamp;\n const CredentialScope = `${formatTimestamp(timestamp)}/vss`;\n const HashedCanonicalRequest = CryptoJS.SHA256(CanonicalRequest).toString(\n CryptoJS.enc.Hex,\n );\n const StringToSign = `${Algorithm}\\n${RequestTimestamp}\\n${CredentialScope}\\n${HashedCanonicalRequest}`;\n // console.log(\"\\n--- StringToSign ---\");\n // console.log(StringToSign);\n\n // 计算签名\n if (!AK || !SK) {\n console.warn(\n \"[tzj-player] 天翼云签名密钥 CTYUNAK / CTYUNSK 为空,签名结果将不被服务端认可,请确认已写入 localStorage\",\n );\n }\n // 第一步:计算SecretDate\n const dateString = formatTimestamp(timestamp);\n const secretKey = `CT${SK}`;\n const SecretDate = CryptoJS.HmacSHA256(dateString, secretKey);\n // console.log(\"\\n--- SecretDate ---\");\n // console.log(SecretDate.toString(CryptoJS.enc.Hex));\n\n // 第二步:计算SigningKey\n const SigningKey = CryptoJS.HmacSHA256(\"vss\", SecretDate);\n // console.log(\"\\n--- SigningKey ---\");\n // console.log(SigningKey.toString(CryptoJS.enc.Hex));\n\n // 第三步:计算最终签名\n const Signature = CryptoJS.HmacSHA256(StringToSign, SigningKey).toString(\n CryptoJS.enc.Hex,\n );\n // console.log(\"\\n--- Signature ---\");\n // console.log(Signature);\n\n // 构建Authorization头\n return `${Algorithm} Credential=${AK}/${CredentialScope}, SignedHeaders=${SignedHeaders}, Signature=${Signature}`;\n}\n\nexport async function ctyunRequest(\n method: \"GET\" | \"POST\",\n url: string,\n params?: {\n query?: Record<string, any> | null;\n body?: Record<string, any> | null;\n },\n): Promise<any> {\n const timestamp = getUnixTimestamp();\n // const timestamp = 1756374060;\n let queryString = \"\";\n let uri = url;\n if (params && params?.query) {\n const temp = params.query;\n queryString = Object.keys(temp)\n .map((key) => `${key}=${temp[key]}`)\n .join(\"&\");\n uri = `${uri}?${queryString}`;\n }\n const Authorization = sign(\n method,\n url,\n queryString,\n `host:vssapi.ctyun.cn\\ntimestamp:${timestamp}`,\n \"host;timestamp\",\n params?.body || null,\n timestamp,\n );\n return new Promise((resolve, reject) => {\n axios({\n method,\n url: `/ctyun${uri}`,\n headers: {\n Authorization,\n Version: \"2021-11-25\",\n Timestamp: timestamp,\n },\n data: params?.body,\n })\n .then((res) => {\n // console.log(res);\n resolve(res.data);\n })\n .catch((err) => {\n // console.log(err);\n if (err.status === 403) {\n resolve(err.response?.data);\n } else {\n reject(err.response?.data);\n }\n });\n });\n}\n\n/**\n * 通过设备ID获取播放流地址\n */\nexport async function GetCtyunDeviceVideoUrl(\n deviceId: string,\n): Promise<string> {\n try {\n // 参数校验\n if (!deviceId) {\n console.warn(\"Device ID is required\");\n return \"\";\n }\n\n const result = await ctyunRequest(\n \"GET\",\n `/devices/${deviceId}/live/stream`,\n {\n query: {\n StreamNum: 1,\n },\n },\n );\n console.log(result);\n // 检查响应状态\n if (!result || result.statusCode !== 200) {\n console.error(\"Failed to get device video stream\", result);\n return \"\";\n }\n\n // 安全地提取播放URL\n const liveStream = result.returnObj?.LiveStreams?.[0];\n const flvUrl = liveStream?.PlayUrl?.FlvUrl;\n\n console.log(flvUrl);\n if (flvUrl) {\n return flvUrl;\n }\n\n console.warn(\"No FLV URL found in response\", result);\n return \"\";\n } catch (error) {\n console.error(\"Error getting device video URL:\", error);\n return \"\";\n }\n}\n\n/**\n * 获取语音对讲WebSocket地址\n */\nexport async function GetCtyunDeviceAudioUrl(deviceId: string): Promise<any> {\n try {\n // 参数校验\n if (!deviceId) {\n console.warn(\"Device ID is required\");\n return {};\n }\n\n const result = await ctyunRequest(\n \"POST\",\n `/devices/${deviceId}/startTalk`,\n {\n body: {\n // 传输优先级 tcp/udp\n TransPriority: \"tcp\",\n // 接入协议\n InProtocol: \"gb28181\",\n },\n },\n );\n console.log(result);\n // 检查响应状态\n if (!result || result.statusCode !== 200) {\n console.error(\"Failed to get device audio stream\", result);\n return {};\n }\n if (result?.returnObj) {\n return result?.returnObj;\n }\n\n console.warn(\"No FLV URL found in response\", result);\n return {\n audioUrl: \"\",\n audioKey: \"\",\n };\n } catch (error) {\n console.error(\"Error getting device audio URL:\", error);\n return {\n audioUrl: \"\",\n audioKey: \"\",\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { defineComponent, ref, shallowRef, onMounted, openBlock, createElementBlock, Fragment, createVNode, withCtx, createCommentVNode, createElementVNode, normalizeClass, toDisplayString } from 'vue';
1
+ import { defineComponent, ref, shallowRef, onMounted, openBlock, createElementBlock, Fragment, createVNode, createCommentVNode, normalizeClass, toDisplayString } from 'vue';
2
2
  import { GetCtyunDeviceVideoUrl } from './ctyun-player.mjs';
3
3
  import './easyPlayer.vue.mjs';
4
4
  import { TzjPlayerProps } from './tzj-player.mjs';
@@ -6,20 +6,6 @@ import _sfc_main$1 from './easyPlayer.vue2.mjs';
6
6
 
7
7
  var __defProp = Object.defineProperty;
8
8
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
- const _hoisted_1 = {
10
- key: 0,
11
- class: "i-easy-player-bar"
12
- };
13
- const _hoisted_2 = { class: "i-easy-player-bar-item i-easy-player-bar-left" };
14
- const _hoisted_3 = {
15
- key: 2,
16
- class: "i-easy-player-bottom-bar"
17
- };
18
- const _hoisted_4 = {
19
- key: 3,
20
- class: "i-easy-player-bottom-bar"
21
- };
22
- const _hoisted_5 = { class: "i-easy-player-bar-item i-easy-player-bar-right" };
23
9
  var _sfc_main = /* @__PURE__ */ defineComponent({
24
10
  ...{
25
11
  name: "CtyunPlayer"
@@ -105,115 +91,13 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
105
91
  "device-serial": _ctx.deviceSerial,
106
92
  "area-name": _ctx.areaName,
107
93
  "pause-mode": _ctx.pauseMode,
108
- onMouseenter: _cache[4] || (_cache[4] = ($event) => showBottomBar.value = true),
109
- onMouseleave: _cache[5] || (_cache[5] = ($event) => showBottomBar.value = false),
110
- onPause: _cache[6] || (_cache[6] = ($event) => isPlaying.value = false),
111
- onPlay: _cache[7] || (_cache[7] = ($event) => isPlaying.value = true),
94
+ onMouseenter: _cache[0] || (_cache[0] = ($event) => showBottomBar.value = true),
95
+ onMouseleave: _cache[1] || (_cache[1] = ($event) => showBottomBar.value = false),
96
+ onPause: _cache[2] || (_cache[2] = ($event) => isPlaying.value = false),
97
+ onPlay: _cache[3] || (_cache[3] = ($event) => isPlaying.value = true),
112
98
  onVideoInfo: handleVideoInfo,
113
99
  onMute: handleMute
114
- }, {
115
- customBar: withCtx(() => [
116
- showBottomBar.value ? (openBlock(), createElementBlock("div", _hoisted_1, [
117
- createCommentVNode(" \u5DE6\u4FA7\uFF1A\u64AD\u653E/\u6682\u505C "),
118
- createElementVNode("div", _hoisted_2, [
119
- createCommentVNode(" \u64AD\u653E "),
120
- !isPlaying.value ? (openBlock(), createElementBlock("div", {
121
- key: 0,
122
- class: "i-easy-player-bottom-bar",
123
- onClick: playerPlay
124
- }, _cache[8] || (_cache[8] = [
125
- createElementVNode(
126
- "i",
127
- { class: "iconfont icon-playfill" },
128
- null,
129
- -1
130
- /* CACHED */
131
- )
132
- ]))) : (openBlock(), createElementBlock(
133
- Fragment,
134
- { key: 1 },
135
- [
136
- createCommentVNode(" \u6682\u505C "),
137
- createElementVNode("div", {
138
- class: "i-easy-player-bottom-bar",
139
- onClick: playerPause
140
- }, _cache[9] || (_cache[9] = [
141
- createElementVNode(
142
- "i",
143
- { class: "iconfont icon-stop" },
144
- null,
145
- -1
146
- /* CACHED */
147
- )
148
- ]))
149
- ],
150
- 2112
151
- /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
152
- )),
153
- !isVolumeMuted.value ? (openBlock(), createElementBlock("div", _hoisted_3, [
154
- createCommentVNode(" \u97F3\u91CF\u56FE\u6807 "),
155
- createElementVNode("i", {
156
- class: "iconfont icon-notificationfill",
157
- onClick: _cache[0] || (_cache[0] = ($event) => handleSetMute(1))
158
- })
159
- ])) : (openBlock(), createElementBlock("div", _hoisted_4, [
160
- createCommentVNode(" \u9759\u97F3\u56FE\u6807 "),
161
- createElementVNode("i", {
162
- class: "iconfont icon-notificationforbidfill",
163
- onClick: _cache[1] || (_cache[1] = ($event) => handleSetMute(0))
164
- })
165
- ]))
166
- ]),
167
- createCommentVNode(" \u622A\u56FE,\u5168\u5C4F "),
168
- createElementVNode("div", _hoisted_5, [
169
- createCommentVNode(" \u622A\u56FE "),
170
- createElementVNode("div", {
171
- class: "i-easy-player-bottom-bar",
172
- onClick: playerScreenShot
173
- }, _cache[10] || (_cache[10] = [
174
- createElementVNode(
175
- "i",
176
- { class: "iconfont icon-picfill" },
177
- null,
178
- -1
179
- /* CACHED */
180
- )
181
- ])),
182
- createCommentVNode(" \u5168\u5C4F "),
183
- !isFullscreen.value ? (openBlock(), createElementBlock("div", {
184
- key: 0,
185
- title: "\u5168\u5C4F",
186
- class: "i-easy-player-bottom-bar",
187
- onClick: _cache[2] || (_cache[2] = ($event) => playerFullscreen(true))
188
- }, _cache[11] || (_cache[11] = [
189
- createElementVNode(
190
- "i",
191
- { class: "iconfont icon-full" },
192
- null,
193
- -1
194
- /* CACHED */
195
- )
196
- ]))) : createCommentVNode("v-if", true),
197
- createCommentVNode(" \u53D6\u6D88\u5168\u5C4F "),
198
- isFullscreen.value ? (openBlock(), createElementBlock("div", {
199
- key: 1,
200
- class: "i-easy-player-bottom-bar",
201
- onClick: _cache[3] || (_cache[3] = ($event) => playerFullscreen(false))
202
- }, _cache[12] || (_cache[12] = [
203
- createElementVNode(
204
- "i",
205
- { class: "iconfont icon-reduction" },
206
- null,
207
- -1
208
- /* CACHED */
209
- )
210
- ]))) : createCommentVNode("v-if", true)
211
- ])
212
- ])) : createCommentVNode("v-if", true)
213
- ]),
214
- _: 1
215
- /* STABLE */
216
- }, 8, ["url", "debug", "access-token", "platform-type-name", "device-serial", "area-name", "pause-mode"]),
100
+ }, null, 8, ["url", "debug", "access-token", "platform-type-name", "device-serial", "area-name", "pause-mode"]),
217
101
  createCommentVNode(" \u8BED\u97F3\u5BF9\u8BB2\u9519\u8BEF\u63D0\u793A "),
218
102
  audioMsg.value.msg ? (openBlock(), createElementBlock(
219
103
  "div",
@@ -1 +1 @@
1
- {"version":3,"file":"ctyun-player.vue2.mjs","sources":["../../../../../../../packages/components/tzj-player/src/ctyun-player.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, ref, shallowRef } from \"vue\";\nimport { GetCtyunDeviceVideoUrl } from \"./ctyun-player\";\nimport EasyPlayer from \"./easyPlayer.vue\";\nimport { TzjPlayerProps } from \"./tzj-player\";\n\n// 天翼云播放器\ndefineOptions({\n name: \"CtyunPlayer\",\n});\n\nconst props = defineProps(TzjPlayerProps);\nconst videoUrl = ref(\"\");\nconst showBottomBar = ref(false);\nconst errorMsg = ref(\"\");\n\n// 播放器相关状态\nconst playerRef = shallowRef();\nconst isPlaying = ref(false); // 是否播放,播放true,暂停false\nconst isFullscreen = ref(false);\nconst isVolumeMuted = ref(true);\n\nconst audioMsg = ref({\n type: \"\",\n msg: \"\",\n}); // 语音对讲提示信息\n\nconst initPlayer = async () => {\n try {\n if (!props.deviceSerial) {\n errorMsg.value = \"设备序列号不能为空\";\n return;\n }\n\n const url = await GetCtyunDeviceVideoUrl(props.deviceSerial);\n if (!url) {\n errorMsg.value = \"获取视频播放地址失败\";\n return;\n }\n\n videoUrl.value = url;\n errorMsg.value = \"\";\n } catch (error) {\n if (props.debug) {\n console.error(\"初始化天翼云播放器失败:\", error);\n }\n errorMsg.value = `初始化失败: ${error instanceof Error ? error.message : \"未知错误\"}`;\n }\n};\n\n/**\n * 播放视频\n */\nconst playerPlay = (): void => {\n playerRef.value?.play();\n};\n\n/**\n * 暂停视频\n */\nconst playerPause = (): void => {\n playerRef.value?.pause();\n};\n\n/**\n * 截图\n */\nconst playerScreenShot = (): void => {\n playerRef.value?.screenshot();\n};\n\n/**\n * 切换全屏状态\n * @param fullscreen 是否全屏\n */\nconst playerFullscreen = (fullscreen: boolean): void => {\n isFullscreen.value = fullscreen;\n playerRef.value?.fullscreen(fullscreen);\n};\n\n// 获取视频信息,判断当前是否为静音状态\nconst handleVideoInfo = () => {\n // 判断是否静音\n isVolumeMuted.value = playerRef.value?.isMute();\n};\nconst handleMute = (mute: boolean) => {\n isVolumeMuted.value = mute;\n};\nconst handleSetMute = (volume: number) => {\n playerRef.value?.setMute(volume);\n};\n\nonMounted(() => {\n initPlayer();\n});\n</script>\n\n<template>\n <EasyPlayer\n ref=\"playerRef\"\n :url=\"videoUrl\"\n :debug=\"debug\"\n :access-token=\"accessToken\"\n :platform-type-name=\"platformTypeName\"\n :device-serial=\"deviceSerial\"\n :area-name=\"areaName\"\n :pause-mode=\"pauseMode\"\n @mouseenter=\"showBottomBar = true\"\n @mouseleave=\"showBottomBar = false\"\n @pause=\"isPlaying = false\"\n @play=\"isPlaying = true\"\n @video-info=\"handleVideoInfo\"\n @mute=\"handleMute\"\n >\n <template #customBar>\n <div v-if=\"showBottomBar\" class=\"i-easy-player-bar\">\n <!-- 左侧:播放/暂停 -->\n <div class=\"i-easy-player-bar-item i-easy-player-bar-left\">\n <!-- 播放 -->\n <div\n v-if=\"!isPlaying\"\n class=\"i-easy-player-bottom-bar\"\n @click=\"playerPlay\"\n >\n <i class=\"iconfont icon-playfill\" />\n </div>\n <!-- 暂停 -->\n <div v-else class=\"i-easy-player-bottom-bar\" @click=\"playerPause\">\n <i class=\"iconfont icon-stop\" />\n </div>\n\n <div v-if=\"!isVolumeMuted\" class=\"i-easy-player-bottom-bar\">\n <!-- 音量图标 -->\n <i\n class=\"iconfont icon-notificationfill\"\n @click=\"handleSetMute(1)\"\n />\n </div>\n <div v-else class=\"i-easy-player-bottom-bar\">\n <!-- 静音图标 -->\n <i\n class=\"iconfont icon-notificationforbidfill\"\n @click=\"handleSetMute(0)\"\n />\n </div>\n </div>\n <!-- 截图,全屏 -->\n <div class=\"i-easy-player-bar-item i-easy-player-bar-right\">\n <!-- 截图 -->\n <div class=\"i-easy-player-bottom-bar\" @click=\"playerScreenShot\">\n <i class=\"iconfont icon-picfill\" />\n </div>\n <!-- 全屏 -->\n <div\n v-if=\"!isFullscreen\"\n title=\"全屏\"\n class=\"i-easy-player-bottom-bar\"\n @click=\"playerFullscreen(true)\"\n >\n <i class=\"iconfont icon-full\" />\n </div>\n <!-- 取消全屏 -->\n <div\n v-if=\"isFullscreen\"\n class=\"i-easy-player-bottom-bar\"\n @click=\"playerFullscreen(false)\"\n >\n <i class=\"iconfont icon-reduction\" />\n </div>\n </div>\n </div>\n </template>\n </EasyPlayer>\n <!-- 语音对讲错误提示 -->\n <div\n v-if=\"audioMsg.msg\"\n class=\"i-tzj-player__voice-default\"\n :class=\"`i-tzj-player__voice-${audioMsg.type}`\"\n >\n {{ audioMsg.msg }}\n </div>\n</template>\n"],"names":["_createVNode","EasyPlayer","debug","accessToken","platformTypeName","deviceSerial","areaName","pauseMode","_openBlock","_createElementBlock","_createCommentVNode","_createElementVNode","_Fragment","_normalizeClass","_toDisplayString"],"mappings":"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"}
1
+ {"version":3,"file":"ctyun-player.vue2.mjs","sources":["../../../../../../../packages/components/tzj-player/src/ctyun-player.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, ref, shallowRef } from \"vue\";\nimport { GetCtyunDeviceVideoUrl } from \"./ctyun-player\";\nimport EasyPlayer from \"./easyPlayer.vue\";\nimport { TzjPlayerProps } from \"./tzj-player\";\n\n// 天翼云播放器\ndefineOptions({\n name: \"CtyunPlayer\",\n});\n\nconst props = defineProps(TzjPlayerProps);\nconst videoUrl = ref(\"\");\nconst showBottomBar = ref(false);\nconst errorMsg = ref(\"\");\n\n// 播放器相关状态\nconst playerRef = shallowRef();\nconst isPlaying = ref(false); // 是否播放,播放true,暂停false\nconst isFullscreen = ref(false);\nconst isVolumeMuted = ref(true);\n\nconst audioMsg = ref({\n type: \"\",\n msg: \"\",\n}); // 语音对讲提示信息\n\nconst initPlayer = async () => {\n try {\n if (!props.deviceSerial) {\n errorMsg.value = \"设备序列号不能为空\";\n return;\n }\n\n const url = await GetCtyunDeviceVideoUrl(props.deviceSerial);\n if (!url) {\n errorMsg.value = \"获取视频播放地址失败\";\n return;\n }\n\n videoUrl.value = url;\n errorMsg.value = \"\";\n } catch (error) {\n if (props.debug) {\n console.error(\"初始化天翼云播放器失败:\", error);\n }\n errorMsg.value = `初始化失败: ${error instanceof Error ? error.message : \"未知错误\"}`;\n }\n};\n\n/**\n * 播放视频\n */\nconst playerPlay = (): void => {\n playerRef.value?.play();\n};\n\n/**\n * 暂停视频\n */\nconst playerPause = (): void => {\n playerRef.value?.pause();\n};\n\n/**\n * 截图\n */\nconst playerScreenShot = (): void => {\n playerRef.value?.screenshot();\n};\n\n/**\n * 切换全屏状态\n * @param fullscreen 是否全屏\n */\nconst playerFullscreen = (fullscreen: boolean): void => {\n isFullscreen.value = fullscreen;\n playerRef.value?.fullscreen(fullscreen);\n};\n\n// 获取视频信息,判断当前是否为静音状态\nconst handleVideoInfo = () => {\n // 判断是否静音\n isVolumeMuted.value = playerRef.value?.isMute();\n};\nconst handleMute = (mute: boolean) => {\n isVolumeMuted.value = mute;\n};\nconst handleSetMute = (volume: number) => {\n playerRef.value?.setMute(volume);\n};\n\nonMounted(() => {\n initPlayer();\n});\n</script>\n\n<template>\n <EasyPlayer\n ref=\"playerRef\"\n :url=\"videoUrl\"\n :debug=\"debug\"\n :access-token=\"accessToken\"\n :platform-type-name=\"platformTypeName\"\n :device-serial=\"deviceSerial\"\n :area-name=\"areaName\"\n :pause-mode=\"pauseMode\"\n @mouseenter=\"showBottomBar = true\"\n @mouseleave=\"showBottomBar = false\"\n @pause=\"isPlaying = false\"\n @play=\"isPlaying = true\"\n @video-info=\"handleVideoInfo\"\n @mute=\"handleMute\"\n >\n </EasyPlayer>\n <!-- 语音对讲错误提示 -->\n <div\n v-if=\"audioMsg.msg\"\n class=\"i-tzj-player__voice-default\"\n :class=\"`i-tzj-player__voice-${audioMsg.type}`\"\n >\n {{ audioMsg.msg }}\n </div>\n</template>\n"],"names":["_createVNode","EasyPlayer","debug","accessToken","platformTypeName","deviceSerial","areaName","pauseMode","_createCommentVNode","_createElementBlock","_normalizeClass","_toDisplayString"],"mappings":"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"}
@@ -271,14 +271,32 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
271
271
  // H.265 走 WebCodecs 硬解(Chrome 的 MSE 不支持 H265,需靠 WCS 兜底)
272
272
  WASM: true,
273
273
  // 硬解不可用时降级 WASM 软解
274
- debug: true,
274
+ debug: false,
275
275
  maxDelay: 300,
276
276
  // 最大容忍延迟300ms,超时自动丢帧追实时画面
277
- reconnect: true
277
+ reconnect: true,
278
278
  // 断线自动重连,单路故障不影响其他8路
279
- // // 使用动态拼接的绝对路径
280
- // decoderPath: `${window.location.origin}/plugins/easy-player/`,
281
- // decoder: "EasyPlayer-decode.js",
279
+ hasControl: true,
280
+ operateBtns: {
281
+ fullscreen: true,
282
+ //全屏
283
+ screenshot: true,
284
+ //截图
285
+ stretch: true,
286
+ //拉伸
287
+ play: true,
288
+ //播放
289
+ audio: false,
290
+ //音量
291
+ record: true,
292
+ //录制
293
+ ptz: false,
294
+ //云台
295
+ zoom: false,
296
+ //缩放
297
+ close: false
298
+ //关闭
299
+ }
282
300
  });
283
301
  createRetryCount = 0;
284
302
  }