trtc-sdk-v5 5.2.0-beta.9 → 5.2.1-beta.1
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/index.d.ts +9 -38
- package/package.json +1 -1
- package/plugins/cdn-streaming/cdn-streaming.esm.js +1 -1
- package/plugins/cdn-streaming/cdn-streaming.iife.js +1 -1
- package/plugins/cdn-streaming/package.json +1 -1
- package/plugins/video-effect/virtual-background/package.json +30 -0
- package/plugins/video-effect/virtual-background/virtual-background.esm.d.ts +27 -0
- package/plugins/video-effect/virtual-background/virtual-background.esm.js +2972 -0
- package/plugins/video-effect/virtual-background/virtual-background.iife.js +2972 -0
- package/trtc.esm.js +20 -20
- package/trtc.js +1 -1
package/index.d.ts
CHANGED
|
@@ -102,6 +102,9 @@
|
|
|
102
102
|
audioTrack?: MediaStreamTrack;
|
|
103
103
|
captureVolume?: number;
|
|
104
104
|
earMonitorVolume?: number;
|
|
105
|
+
echoCancellation?: boolean;
|
|
106
|
+
autoGainControl?: boolean;
|
|
107
|
+
noiseSuppression?: boolean;
|
|
105
108
|
};
|
|
106
109
|
}
|
|
107
110
|
declare interface RemoteAudioConfig {
|
|
@@ -291,15 +294,18 @@
|
|
|
291
294
|
'AudioMixer': AudioMixerOptions;
|
|
292
295
|
'AIDenoiser': AIDenoiserOptions;
|
|
293
296
|
'CDNStreaming': CDNStreamingOptions;
|
|
297
|
+
'VirtualBackground': VirtualBackgroundOptions;
|
|
294
298
|
};
|
|
295
299
|
declare type PluginUpdateOptionsMap = {
|
|
296
300
|
'AudioMixer': UpdateAudioMixerOptions;
|
|
297
301
|
'CDNStreaming': CDNStreamingOptions;
|
|
302
|
+
'VirtualBackground': UpdateVirtualBackgroundOptions;
|
|
298
303
|
};
|
|
299
304
|
declare type PluginStopOptionsMap = {
|
|
300
305
|
'AudioMixer': StopAudioMixerOptions;
|
|
301
306
|
'AIDenoiser': undefined;
|
|
302
307
|
'CDNStreaming': CDNStreamingOptions;
|
|
308
|
+
'VirtualBackground': undefined;
|
|
303
309
|
};
|
|
304
310
|
declare interface TRTCStatistics {
|
|
305
311
|
rtt: number;
|
|
@@ -968,6 +974,7 @@
|
|
|
968
974
|
* @param {object} [config.option] - 本地音频选项
|
|
969
975
|
* @param {string} [config.option.microphoneId]- 指定使用哪个麦克风
|
|
970
976
|
* @param {MediaStreamTrack} [config.option.audioTrack] - 自定义采集的 audioTrack。{@tutorial 20-advanced-customized-capture-rendering}。
|
|
977
|
+
* @param {number} [config.option.captureVolume] - 设置采集音量,默认值 100,设置小于 100 可以降低采集音量,设置大于 100 可以放大采集音量,注意有爆音风险。
|
|
971
978
|
* @param {number} [config.option.earMonitorVolume] - 设置耳返音量,取值[0, 100],本地麦克风默认静音播放。
|
|
972
979
|
* @param {string} [config.option.profile] - 音频编码配置, 默认{@link module:TYPE.AUDIO_PROFILE_STANDARD TRTC.TYPE.AUDIO_PROFILE_STANDARD}
|
|
973
980
|
* @throws
|
|
@@ -1001,6 +1008,8 @@
|
|
|
1001
1008
|
* @param {object} [config.option] - 本地音频配置
|
|
1002
1009
|
* @param {string} [config.option.microphoneId] - 指定使用哪个麦克风,用来切换麦克风。
|
|
1003
1010
|
* @param {MediaStreamTrack} [config.option.audioTrack] - 自定义采集的 audioTrack。 {@tutorial 20-advanced-customized-capture-rendering}。
|
|
1011
|
+
* @param {number} [config.option.captureVolume] - 设置采集音量,默认值 100,设置小于 100 可以降低采集音量,设置大于 100 可以放大采集音量,注意有爆音风险。
|
|
1012
|
+
* @param {number} [config.option.earMonitorVolume] - 设置耳返音量,取值[0, 100],本地麦克风默认静音播放。
|
|
1004
1013
|
* @throws
|
|
1005
1014
|
* - {@link module:ERROR_CODE.INVALID_PARAMETER INVALID_PARAMETER}
|
|
1006
1015
|
* - {@link module:ERROR_CODE.DEVICE_ERROR DEVICE_ERROR}
|
|
@@ -1345,48 +1354,10 @@
|
|
|
1345
1354
|
* await trtc.setRemoteAudioVolume('123', 90);
|
|
1346
1355
|
* */
|
|
1347
1356
|
setRemoteAudioVolume(userId: string, volume: number): void;
|
|
1348
|
-
/**
|
|
1349
|
-
* 开启插件
|
|
1350
|
-
*
|
|
1351
|
-
* | pluginName | 插件名称 | 参考教程 | 参数类型 |
|
|
1352
|
-
* | --- | --- | --- | --- |
|
|
1353
|
-
* | 'AudioMixer' | 背景音乐插件 | {@tutorial 22-advanced-audio-mixer} | [AudioMixerOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#AudioMixerOptions) |
|
|
1354
|
-
* | 'AIDenoiser' | 降噪插件 | {@tutorial 35-advanced-ai-denoiser} | [AIDenoiserOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#AIDenoiserOptions) |
|
|
1355
|
-
* | 'CDNStreaming' | CDN混流插件 | {@tutorial 26-advanced-publish-cdn-stream} | [CDNStreamingOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#CDNStreamingOptions) |
|
|
1356
|
-
*
|
|
1357
|
-
* @param {PluginName} plugin
|
|
1358
|
-
* @param {AudioMixerOptions|AIDenoiserOptions|CDNStreamingOptions} options
|
|
1359
|
-
* @returns {Promise<void>}
|
|
1360
|
-
*/
|
|
1361
1357
|
startPlugin<T extends keyof PluginStartOptionsMap, O extends PluginStartOptionsMap[T]>(plugin: O extends undefined ? never : T, options: O): Promise<any>;
|
|
1362
1358
|
startPlugin<T extends keyof PluginStartOptionsMap, O extends PluginStartOptionsMap[T]>(plugin: O extends undefined ? T : never): Promise<any>;
|
|
1363
|
-
/**
|
|
1364
|
-
* 更新插件
|
|
1365
|
-
*
|
|
1366
|
-
* | pluginName | 插件名称 | 参考教程 | 参数类型 |
|
|
1367
|
-
* | --- | --- | --- | --- |
|
|
1368
|
-
* | 'AudioMixer' | 背景音乐插件 | {@tutorial 22-advanced-audio-mixer} | [UpdateAudioMixerOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#UpdateAudioMixerOptions) |
|
|
1369
|
-
* | 'CDNStreaming' | CDN混流插件 | {@tutorial 26-advanced-publish-cdn-stream} | [CDNStreamingOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#CDNStreamingOptions) |
|
|
1370
|
-
*
|
|
1371
|
-
* @param {PluginName} plugin
|
|
1372
|
-
* @param {UpdateAudioMixerOptions|CDNStreamingOptions} options
|
|
1373
|
-
* @returns {Promise<void>}
|
|
1374
|
-
*/
|
|
1375
1359
|
updatePlugin<T extends keyof PluginUpdateOptionsMap, O extends PluginUpdateOptionsMap[T]>(plugin: O extends undefined ? never : T, options: O): Promise<any>;
|
|
1376
1360
|
updatePlugin<T extends keyof PluginUpdateOptionsMap, O extends PluginUpdateOptionsMap[T]>(plugin: O extends undefined ? T : never): Promise<any>;
|
|
1377
|
-
/**
|
|
1378
|
-
* 停止插件
|
|
1379
|
-
*
|
|
1380
|
-
* | pluginName | 插件名称 | 参考教程 | 参数类型 |
|
|
1381
|
-
* | --- | --- | --- | --- |
|
|
1382
|
-
* | 'AudioMixer' | 背景音乐插件 | {@tutorial 22-advanced-audio-mixer} | [StopAudioMixerOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/en/global.html#StopAudioMixerOptions) |
|
|
1383
|
-
* | 'AIDenoiser' | 降噪插件 | {@tutorial 35-advanced-ai-denoiser} | |
|
|
1384
|
-
* | 'CDNStreaming' | CDN混流插件 | {@tutorial 26-advanced-publish-cdn-stream} | [CDNStreamingOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/en/global.html#CDNStreamingOptions) |
|
|
1385
|
-
*
|
|
1386
|
-
* @param {PluginName} plugin
|
|
1387
|
-
* @param {StopAudioMixerOptions|StopAIDenoiserOptions|CDNStreamingOptions} options
|
|
1388
|
-
* @returns {Promise<void>}
|
|
1389
|
-
*/
|
|
1390
1361
|
stopPlugin<T extends keyof PluginStopOptionsMap, O extends PluginStopOptionsMap[T]>(plugin: O extends undefined ? never : T, options: O): Promise<any>;
|
|
1391
1362
|
stopPlugin<T extends keyof PluginStopOptionsMap, O extends PluginStopOptionsMap[T]>(plugin: O extends undefined ? T : never): Promise<any>;
|
|
1392
1363
|
/**
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var ne=Object.create;var H=Object.defineProperty,ue=Object.defineProperties,de=Object.getOwnPropertyDescriptor,me=Object.getOwnPropertyDescriptors,le=Object.getOwnPropertyNames,q=Object.getOwnPropertySymbols,he=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty,ce=Object.prototype.propertyIsEnumerable;var $=(l,e,i)=>e in l?H(l,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):l[e]=i,I=(l,e)=>{for(var i in e||(e={}))X.call(e,i)&&$(l,i,e[i]);if(q)for(var i of q(e))ce.call(e,i)&&$(l,i,e[i]);return l},W=(l,e)=>ue(l,me(e));var pe=(l,e)=>()=>(e||l((e={exports:{}}).exports,e),e.exports);var ge=(l,e,i,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of le(e))!X.call(l,d)&&d!==i&&H(l,d,{get:()=>e[d],enumerable:!(u=de(e,d))||u.enumerable});return l};var z=(l,e,i)=>(i=l!=null?ne(he(l)):{},ge(e||!l||!l.__esModule?H(i,"default",{value:l,enumerable:!0}):i,l));var b=(l,e,i)=>($(l,typeof e!="symbol"?e+"":e,i),i);var V=pe((j,x)=>{(function(l){"use strict";function e(t,h){var r=(t&65535)+(h&65535),g=(t>>16)+(h>>16)+(r>>16);return g<<16|r&65535}function i(t,h){return t<<h|t>>>32-h}function u(t,h,r,g,T,C){return e(i(e(e(h,t),e(g,C)),T),r)}function d(t,h,r,g,T,C,f){return u(h&r|~h&g,t,h,T,C,f)}function c(t,h,r,g,T,C,f){return u(h&g|r&~g,t,h,T,C,f)}function m(t,h,r,g,T,C,f){return u(h^r^g,t,h,T,C,f)}function p(t,h,r,g,T,C,f){return u(r^(h|~g),t,h,T,C,f)}function S(t,h){t[h>>5]|=128<<h%32,t[(h+64>>>9<<4)+14]=h;var r,g,T,C,f,o=1732584193,a=-271733879,s=-1732584194,n=271733878;for(r=0;r<t.length;r+=16)g=o,T=a,C=s,f=n,o=d(o,a,s,n,t[r],7,-680876936),n=d(n,o,a,s,t[r+1],12,-389564586),s=d(s,n,o,a,t[r+2],17,606105819),a=d(a,s,n,o,t[r+3],22,-1044525330),o=d(o,a,s,n,t[r+4],7,-176418897),n=d(n,o,a,s,t[r+5],12,1200080426),s=d(s,n,o,a,t[r+6],17,-1473231341),a=d(a,s,n,o,t[r+7],22,-45705983),o=d(o,a,s,n,t[r+8],7,1770035416),n=d(n,o,a,s,t[r+9],12,-1958414417),s=d(s,n,o,a,t[r+10],17,-42063),a=d(a,s,n,o,t[r+11],22,-1990404162),o=d(o,a,s,n,t[r+12],7,1804603682),n=d(n,o,a,s,t[r+13],12,-40341101),s=d(s,n,o,a,t[r+14],17,-1502002290),a=d(a,s,n,o,t[r+15],22,1236535329),o=c(o,a,s,n,t[r+1],5,-165796510),n=c(n,o,a,s,t[r+6],9,-1069501632),s=c(s,n,o,a,t[r+11],14,643717713),a=c(a,s,n,o,t[r],20,-373897302),o=c(o,a,s,n,t[r+5],5,-701558691),n=c(n,o,a,s,t[r+10],9,38016083),s=c(s,n,o,a,t[r+15],14,-660478335),a=c(a,s,n,o,t[r+4],20,-405537848),o=c(o,a,s,n,t[r+9],5,568446438),n=c(n,o,a,s,t[r+14],9,-1019803690),s=c(s,n,o,a,t[r+3],14,-187363961),a=c(a,s,n,o,t[r+8],20,1163531501),o=c(o,a,s,n,t[r+13],5,-1444681467),n=c(n,o,a,s,t[r+2],9,-51403784),s=c(s,n,o,a,t[r+7],14,1735328473),a=c(a,s,n,o,t[r+12],20,-1926607734),o=m(o,a,s,n,t[r+5],4,-378558),n=m(n,o,a,s,t[r+8],11,-2022574463),s=m(s,n,o,a,t[r+11],16,1839030562),a=m(a,s,n,o,t[r+14],23,-35309556),o=m(o,a,s,n,t[r+1],4,-1530992060),n=m(n,o,a,s,t[r+4],11,1272893353),s=m(s,n,o,a,t[r+7],16,-155497632),a=m(a,s,n,o,t[r+10],23,-1094730640),o=m(o,a,s,n,t[r+13],4,681279174),n=m(n,o,a,s,t[r],11,-358537222),s=m(s,n,o,a,t[r+3],16,-722521979),a=m(a,s,n,o,t[r+6],23,76029189),o=m(o,a,s,n,t[r+9],4,-640364487),n=m(n,o,a,s,t[r+12],11,-421815835),s=m(s,n,o,a,t[r+15],16,530742520),a=m(a,s,n,o,t[r+2],23,-995338651),o=p(o,a,s,n,t[r],6,-198630844),n=p(n,o,a,s,t[r+7],10,1126891415),s=p(s,n,o,a,t[r+14],15,-1416354905),a=p(a,s,n,o,t[r+5],21,-57434055),o=p(o,a,s,n,t[r+12],6,1700485571),n=p(n,o,a,s,t[r+3],10,-1894986606),s=p(s,n,o,a,t[r+10],15,-1051523),a=p(a,s,n,o,t[r+1],21,-2054922799),o=p(o,a,s,n,t[r+8],6,1873313359),n=p(n,o,a,s,t[r+15],10,-30611744),s=p(s,n,o,a,t[r+6],15,-1560198380),a=p(a,s,n,o,t[r+13],21,1309151649),o=p(o,a,s,n,t[r+4],6,-145523070),n=p(n,o,a,s,t[r+11],10,-1120210379),s=p(s,n,o,a,t[r+2],15,718787259),a=p(a,s,n,o,t[r+9],21,-343485551),o=e(o,g),a=e(a,T),s=e(s,C),n=e(n,f);return[o,a,s,n]}function _(t){var h,r="",g=t.length*32;for(h=0;h<g;h+=8)r+=String.fromCharCode(t[h>>5]>>>h%32&255);return r}function D(t){var h,r=[];for(r[(t.length>>2)-1]=void 0,h=0;h<r.length;h+=1)r[h]=0;var g=t.length*8;for(h=0;h<g;h+=8)r[h>>5]|=(t.charCodeAt(h/8)&255)<<h%32;return r}function A(t){return _(S(D(t),t.length*8))}function U(t,h){var r,g=D(t),T=[],C=[],f;for(T[15]=C[15]=void 0,g.length>16&&(g=S(g,t.length*8)),r=0;r<16;r+=1)T[r]=g[r]^909522486,C[r]=g[r]^1549556828;return f=S(T.concat(D(h)),512+h.length*8),_(S(C.concat(f),512+128))}function E(t){var h="0123456789abcdef",r="",g,T;for(T=0;T<t.length;T+=1)g=t.charCodeAt(T),r+=h.charAt(g>>>4&15)+h.charAt(g&15);return r}function R(t){return unescape(encodeURIComponent(t))}function P(t){return A(R(t))}function F(t){return E(P(t))}function J(t,h){return U(R(t),R(h))}function se(t,h){return E(J(t,h))}function B(t,h,r){return h?r?J(h,t):se(h,t):r?P(t):F(t)}typeof define=="function"&&define.amd?define(function(){return B}):typeof x=="object"&&x.exports?x.exports=B:l.md5=B})(j)});var Y=z(V(),1);var N=(u=>(u.PublishMainStreamToCDN="publish-main-stream-to-cdn",u.PublishSubStreamToCDN="publish-sub-stream-to-cdn",u.PublishMixStreamToCDN="publish-mix-stream-to-cdn",u))(N||{}),K=(i=>(i.Main="main",i.Sub="sub",i))(K||{});var v={IT_AUDIO_VIDEO:0,IT_PICTURE:2,IT_CANVAS:3,IT_PURE_AUDIO:4,IT_PURE_VIDEO:5};var M=class{constructor(e){b(this,"_room");b(this,"_log");b(this,"_paramsForGivenCDN");b(this,"_publishGivenCDNData",null);b(this,"_isPublishingGivenCDN",!1);this._room=e.room,this._log=e.log,this._paramsForGivenCDN=new Map([["publish-main-stream-to-cdn",null],["publish-sub-stream-to-cdn",null],["publish-mix-stream-to-cdn",null]])}async startPublishGivenCDN(e){this._log.info(`startPublishGivenCDN() ${JSON.stringify(e)}`),this._paramsForGivenCDN.set(e.publishMode,e);let i={pushRequestTime:Date.now(),pushAppId:e.appId,pushBizId:e.bizId,pushCdnUrl:e.url,pushStreamType:this.convertStreamType(e==null?void 0:e.publishMode),pushStreamId:e.streamId};this._publishGivenCDNData=i;try{this._isPublishingGivenCDN&&await this.stopPublishGivenCDN();let u=await this._room.sendStartPublishCDN(i,!1),{code:d,message:c}=u.data;if(d===0)this._isPublishingGivenCDN=!0;else throw this.resetGivenCDN(),this._log.error(`startPublishGivenCDN failed, errCode: ${d}, errMsg: ${c}`),new Error(`startPublishGivenCDN failed, errCode: ${d} errMsg: ${c}`)}catch(u){throw this.resetGivenCDN(),u}}async stopPublishGivenCDN(){if(this._log.info(`stopPublishGivenCDN: ${JSON.stringify(this._publishGivenCDNData)}`),!this._isPublishingGivenCDN||!this._publishGivenCDNData){this.resetGivenCDN();return}let{pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:d,pushStreamId:c}=this._publishGivenCDNData,m={pushRequestTime:Date.now(),pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:d,pushStreamId:c},p=await this._room.sendStopPublishCDN(m,!1),{code:S,message:_}=p.data;if(S===0)this.resetGivenCDN();else throw this._log.error(`stopPublishGivenCDN failed, errCode: ${S} errMsg: ${_}`),new Error(`stopPublishGivenCDN failed, errCode: ${S} errMsg: ${_}`)}resetGivenCDN(){this._publishGivenCDNData=null,this._isPublishingGivenCDN=!1}convertStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}};var y=class{constructor(e,i){b(this,"_core");b(this,"_room");b(this,"cdnLog");b(this,"_config",null);b(this,"_data",null);b(this,"_givenCDNManager");this._core=e,this._room=e.room,this.cdnLog=i,this.reset()}get isMixing(){return!!this._data}get isStarted(){return!!this._config}get hasCustomCDN(){var e,i,u;return((e=this._config)==null?void 0:e.target.appId)&&((i=this._config)==null?void 0:i.target.bizId)&&((u=this._config)==null?void 0:u.target.url)}async startMixTranscode(e){if(this.cdnLog.info(`startMixTranscode: ${e}`),this._config=e,this.installEvents(),!!this._core.room.isJoined)try{let i=this.getInputParam(e),u=this.getOutputParam(e),d=this.getOutputSessionId({config:e,roomId:this._room.roomId,userId:this._room.userId});this.isMixing&&this._data&&d!==this._data.outputSessionId&&(this.cdnLog.info("startMixTranscode() streamId changed, stop mixing before start"),await this.doStopMixTranscode()),await this.doStartMixTranscode({outputSessionId:d,inputParam:i,outputParam:u});let{appId:c,bizId:m,url:p,streamId:S=""}=this._config.target;c&&m&&p&&(this._givenCDNManager||(this._givenCDNManager=new M(this._core)),await this._givenCDNManager.startPublishGivenCDN({publishMode:e.target.publishMode,appId:c,bizId:m,url:p,streamId:S}))}catch(i){throw this.reset(),i}}async doStartMixTranscode({outputSessionId:e,inputParam:i,outputParam:u}){let d={roomId:String(this._room.roomId),mcuRequestTime:Date.now(),outputSessionId:e,inputParam:i,outputParam:u};this.cdnLog.info(`doStartMixTranscode: ${JSON.stringify(d)}`);let c=await this._room.sendStartMixTranscode(d),{code:m}=c.data,{message:p}=c.data;if(m===0)this._data=d;else throw m===-102083&&(p=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this.cdnLog.error(`startMixTranscode failed, errCode: ${m} errMsg: ${p}`),new Error(`startMixTranscode failed, errCode: ${m} errMsg: ${p}`)}async stopMixTranscode(){this.cdnLog.info(`stopMixTranscode: ${this.isMixing}`);try{this.isStarted&&this.isMixing&&(await this.doStopMixTranscode(),this._config&&this.hasCustomCDN&&this._givenCDNManager&&await this._givenCDNManager.stopPublishGivenCDN())}catch(e){throw e}this.reset()}async doStopMixTranscode(){let e={mcuRequestTime:Date.now(),outputSessionId:this._data.outputSessionId,streamType:this._data.outputParam.streamType};this.cdnLog.info(`doStopMixTranscode: ${JSON.stringify(e)}`);let i=await this._room.sendStopMixTranscode(e),{code:u,message:d}=i.data;if(u===0)this.reset();else throw this.cdnLog.error(`stopMixTranscode failed, errCode: ${u} errMsg: ${d}`),new Error(`stopMixTranscode failed, errCode: ${u} errMsg: ${d}`)}reset(){this._config=null,this._data=null,this.uninstallEvents()}installEvents(){this._core.room.on("joined",this.handleRoomJoined,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.room.off("joined",this.handleRoomJoined,this),this._core.room.off("left",this.handleRoomLeft,this)}async handleRoomJoined(){this.cdnLog.info(`handleJoined() ${JSON.stringify(this._config)}`),this.isStarted&&this._config&&await this.startMixTranscode(this._config)}async handleRoomLeft(){this.cdnLog.info(`handleJoined() ${JSON.stringify(this._config)}`),this._data=null}getOutputSessionId({config:e,userId:i,roomId:u}){return this._core.utils.isString(e.target.streamId)&&e.target.streamId.length>0?e.target.streamId:(0,Y.default)(`${u}_${i}_main`)}getStringRoomId(e,i){return e?String(e):i}getInputParam(e){let{mix:i={}}=e,{audioMixUserList:u=[],videoLayoutList:d=[]}=i,c=d.map(m=>({userId:m.fixedVideoUser.userId,roomId:this.getStringRoomId(m.fixedVideoUser.roomId,m.fixedVideoUser.strRoomId)||this._core.room.roomId,width:m.width||0,height:m.height||0,locationX:m.locationX||0,locationY:m.locationY||0,zOrder:m.zOrder||1,streamType:m.fixedVideoStreamType==="sub"?1:0,inputType:v.IT_PURE_VIDEO,renderMode:m.fillMode||0}));return u.forEach(m=>{let p=c.findIndex(S=>S.userId===m.userId&&S.room===this.getStringRoomId(m.roomId,m.strRoomId));p!==-1?c[p].inputType=v.IT_AUDIO_VIDEO:c.push({userId:m.userId,roomId:m.roomId||m.strRoomId,inputType:v.IT_PURE_AUDIO})}),c}getOutputParam(e){let i=e.target.streamId||"",{encoding:u={},mix:d={}}=e;return{streamId:i,streamType:i.length>0?1:0,width:this._core.utils.isUndefined(u.videoWidth)?640:u.videoWidth,height:this._core.utils.isUndefined(u.videoHeight)?480:u.videoHeight,videoBps:u.videoBitrate||0,fps:u.videoFramerate||15,gop:u.videoGOP||2,audioSampleRate:u.audioSampleRate||48e3,audioBps:u.audioBitrate||64,audioChannels:u.audioChannels||1,backgroundColor:d.backgroundColor||0,backgroundImg:d.backgroundImage||"",extraInfo:"",videoCodec:2,audioCodec:0}}};var w=z(V(),1);var L=class{constructor(e,i){b(this,"_core");b(this,"_room");b(this,"cdnLog");b(this,"_paramsForTencentCDN");b(this,"_initParamsForTencentCDN",{isPublished:!1,isStarted:!1});this._core=e,this._room=e.room,this.cdnLog=i,this._paramsForTencentCDN=new Map([["publish-main-stream-to-cdn",this._initParamsForTencentCDN],["publish-sub-stream-to-cdn",this._initParamsForTencentCDN]])}installEvents(){this._core.innerEmitter.on("104",this.handlePublished,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.innerEmitter.off("104",this.handlePublished,this),this._core.room.off("left",this.handleRoomLeft,this)}async handlePublished({track:e}){var d;this.cdnLog.info(`handlePublished: mediaType ${e.mediaType}, roomID ${(d=e==null?void 0:e.room)==null?void 0:d.roomId}`);let i=e.mediaType===4?"publish-main-stream-to-cdn":"publish-sub-stream-to-cdn",u=this._paramsForTencentCDN.get(i)||null;u!=null&&u.target&&u.isStarted&&await this.startPublishTencentCDN(u.target)}async handleRoomLeft(){this.changeDataStatus("publish-main-stream-to-cdn",{isPublished:!1}),this.changeDataStatus("publish-sub-stream-to-cdn",{isPublished:!1})}isStreamPublished(e){return e==="publish-main-stream-to-cdn"&&!this._room.isMainStreamPublished?(this.cdnLog.info("Main stream has not already published, will auto reStart after published."),!1):e==="publish-sub-stream-to-cdn"&&!this._room.isAuxStreamPublished?(this.cdnLog.info("Sub has not already published, will auto reStart after published."),!1):!0}changeDataStatus(e,i){let u=this._paramsForTencentCDN.get(e),d=I(I({},u),i);this._paramsForTencentCDN.set(e,d)}async startPublishTencentCDN(e){if(this.cdnLog.info(`startPublishTencentCDN ${JSON.stringify(e)}`),this.installEvents(),this.changeDataStatus(e.publishMode,{target:e,isStarted:!0}),!this.isStreamPublished(e.publishMode))return;let i=e.streamId||"",u=this.generatePublishCDNStreamId(i,e.publishMode),d=this.generatePublishCDNSessionId(e.publishMode),c=e.publishMode==="publish-sub-stream-to-cdn"?1:0,m={requestTime:Date.now(),sessionId:d,streamId:u,streamType:c};await this.doStartPublishTencentCDN(m,e.publishMode);let{appId:p,bizId:S,url:_}=e;if(p&&S&&_){let D=this._paramsForTencentCDN.get(e.publishMode)||this._initParamsForTencentCDN;D!=null&&D.givenCDNManager||(D.givenCDNManager=new M(this._core),this._paramsForTencentCDN.set(e.publishMode,D)),await D.givenCDNManager.startPublishGivenCDN({publishMode:e.publishMode,appId:p,bizId:S,url:_,streamId:u})}}async doStartPublishTencentCDN(e,i){this.cdnLog.info(`doStartPublishTencentCDN: ${JSON.stringify(e)}`);try{let c=0;for(;;){let m=await this._room.sendStartPublishCDN(e,!0),{code:p}=m.data,{message:S}=m.data;if(p===0){this.cdnLog.info(`doStartPublishTencentCDN: success ${JSON.stringify(m)}`),this.changeDataStatus(i,{isPublished:!0});break}else if(p===-10006&&c<6)this.cdnLog.warn(`doStartPublishTencentCDN: retry...${c+1}/6, reason: ${S}`),c+=1,await new Promise(_=>setTimeout(_,500));else throw this.changeDataStatus(i,{isPublished:!1}),p===-102083&&(S=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),new Error(`startPublishTencentCDN failed, errCode: ${p} errMsg: ${S}`)}}catch(u){throw this.cdnLog.error(`startPublishTencentCDN failed, error: ${u}`),this.changeDataStatus(i,{isPublished:!1}),u}}async stopPublishTencentCDN(e){let i=this._paramsForTencentCDN.get(e)||this._initParamsForTencentCDN;if(i.isPublished){let{target:u}=i;u!=null&&u.bizId&&u.appId&&u.url&&(i!=null&&i.givenCDNManager)&&await(i==null?void 0:i.givenCDNManager.stopPublishGivenCDN()),await this.doStopPublishTencentCDN(e)}this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}async doStopPublishTencentCDN(e){let i={requestTime:Date.now(),sessionId:(0,w.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)};this.cdnLog.info(`stopPublishTencentCDN: ${JSON.stringify(i)}`);let u=await this._room.sendStopPublishCDN(i,!0),{code:d,message:c}=u.data;if(d===0)this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),this.reset(e);else if(d===-102069)this.cdnLog.error("stopPublishTencentCDN failed, can not stopPublishTencentCDN in auto relayed-push mode"),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN);else throw this.cdnLog.error(`stopPublishTencentCDN failed, errCode: ${d} errMsg: ${c}`),new Error(`stopPublishTencentCDN failed, errCode: ${d} errMsg: ${c}`)}reset(e){this.uninstallEvents(),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}generatePublishCDNStreamId(e,i){if(e===""){let u=`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(i)}`;return/^[A-Za-z\d_-]*$/.test(u)||(u=(0,w.default)(u)),`${this._room.sdkAppId}_${u}`}return e}convertPublishModeToStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}generatePublishCDNSessionId(e){return(0,w.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)}};var Z=l=>typeof l=="string";function Se(l,e,i,u){if(!/^[A-Za-z\d_-]*$/.test(l))throw new Error("Invalid parameter streamId.")}function Te(l,e,i,u){if(Z(l))throw new Error("roomId must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.");if(l===void 0)return;if(!(/^[1-9]\d*$/.test(String(l))&&l<4294967295))throw new Error("roomId must be an integer between [1, 4294967294].")}function Ce(l,e,i,u){if(!/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(l))throw new Error("strRoomId must be a valid string.")}var O={type:"number",notLessThanZero:!0},Q={type:"object",required:!0,properties:{userId:{required:!0,type:"string"},roomId:{type:["string","number"],validate:Te},strRoomId:{type:"string",validate:Ce}}},ee={required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]},streamId:{required:!1,type:"string",validate:Se},appId:{type:"number",allowEmpty:!1},bizId:{type:"number",allowEmpty:!1},url:{type:"string",allowEmpty:!1}}},te={required:!1,type:"object",properties:{videoWidth:O,videoHeight:O,videoBitrate:W(I({},O),{allowEmpty:!1}),videoFramerate:{type:"number",validate(l,e,i,u){if(l<=0||l>30)throw new Error("Invalid parameter mixConfig -> videoFramerate, the value must be between (0, 30].")}},videoGOP:{type:"number",validate(l,e,i,u){if(l<1||l>8)throw new Error("Invalid parameter mixConfig -> videoGOP, the value must be between [1, 8].")}},audioSampleRate:O,audioBitrate:{type:"number",validate(l,e,i,u){if(l<32||l>192)throw new Error("Invalid parameter mixConfig -> audioBitrate, the value must be between [32, 192].")}},audioChannels:{type:"number",values:[1,2]}}},re={required:!1,type:"object",properties:{backgroundColor:{type:"number"},backgroundImage:{type:"string"},audioMixUserList:{type:"array",arrayItem:I({},Q)},videoLayoutList:{type:"array",required:!0,arrayItem:{type:"object",properties:{fixedVideoUser:I({},Q),fixedVideoStreamType:{type:"string",required:!0,values:["main","sub"]},fillMode:{type:"number",values:[0,1,2,4]},zOrder:{type:"number",required:!0,validate(l,e,i,u){if(l<1||l>15)throw new Error("Invalid parameter mix -> videoLayoutList -> zOrder, the value must be between [1, 15].")}},width:O,height:O,locationX:O,locationY:O}}}}};function ie(l){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},ee),encoding:I({},te),mix:I({},re)},validate(e,i,u,d){var S,_;let{publishMode:c}=e.target,{encoding:m,mix:p}=e;if(c==="publish-mix-stream-to-cdn"){if(!m||!p)throw new Error("Invalid parameter mix & encoding, the value must be not empty.");if(p&&p.videoLayoutList){let D=0,A=0,U=[];if(p.videoLayoutList.forEach((P,F)=>{U.push(P.fixedVideoUser.userId),P.width+P.locationX>D&&(D=P.width+P.locationX),P.height+P.locationY>A&&(A=P.height+P.locationY)}),U.indexOf(l.room.userId)<0)throw new Error("Invalid parameter mix -> videoLayoutList, the value must be include self.");let E=(S=m==null?void 0:m.videoWidth)!=null?S:640,R=(_=m==null?void 0:m.videoHeight)!=null?_:480;if(E<D||R<A)throw new Error("Invalid parameter encoding, the width and height of the mixed video must encompass all the mixed-in video streams.")}}}}}function oe(l){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},ee),encoding:I({},te),mix:I({},re)}}}function ae(l){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:{required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]}}}}}}var G=0,k=class{constructor(e){this.core=e;b(this,"_mixTranscodeManager");b(this,"_publishCDNManager");b(this,"_core");b(this,"cdnLog");b(this,"_modeOptions");b(this,"seq");G=G+1,this.seq=G,this.cdnLog=e.log.createChild({id:`${this.getAlias()}${G}`}),this._core=e,this.cdnLog.info("CDNStreaming created"),this._modeOptions=new Map,this._mixTranscodeManager=new y(e,this.cdnLog),this._publishCDNManager=new L(e,this.cdnLog)}getName(){return"CDNStreaming"}getAlias(){return"cdn"}getValidateRule(e){switch(e){case"start":return ie(this._core);case"update":return oe(this._core);case"stop":return ae(this._core)}}getGroup(e){return e.target.publishMode}async start(e){return this.cdnLog.info(`Plugin CDNStreaming start: ${JSON.stringify(e)}`),this._modeOptions.set(e.target.publishMode,e),await this.doStart(e)}async update(e){this.cdnLog.info(`Plugin CDNStreaming update: ${JSON.stringify(e)}`);let i=this._modeOptions.get(e.target.publishMode);return this._core.utils.deepMerge(i,e),await this.doStart(i)}async stop(e){switch(this.cdnLog.info(`Plugin CDNStreaming stop: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.stopMixTranscode();break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.stopPublishTencentCDN(e.target.publishMode);break}}this._modeOptions.delete(e.target.publishMode)}async doStart(e){switch(this.cdnLog.info(`Plugin CDNStreaming doStart: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.startMixTranscode(e);break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.startPublishTencentCDN(e.target);break}}}};b(k,"TYPE",{PublishMode:{PublishMainStreamToCDN:"publish-main-stream-to-cdn",PublishSubStreamToCDN:"publish-sub-stream-to-cdn",PublishMixStreamToCDN:"publish-mix-stream-to-cdn"}});var tt=k;export{k as CDNStreaming,N as PublishMode,K as TRTCStreamType,tt as default};
|
|
1
|
+
var ue=Object.create;var V=Object.defineProperty,de=Object.defineProperties,me=Object.getOwnPropertyDescriptor,le=Object.getOwnPropertyDescriptors,ce=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols,he=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var H=(m,e,i)=>e in m?V(m,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):m[e]=i,I=(m,e)=>{for(var i in e||(e={}))W.call(e,i)&&H(m,i,e[i]);if(X)for(var i of X(e))pe.call(e,i)&&H(m,i,e[i]);return m},z=(m,e)=>de(m,le(e));var ge=(m,e)=>()=>(e||m((e={exports:{}}).exports,e),e.exports);var Se=(m,e,i,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of ce(e))!W.call(m,d)&&d!==i&&V(m,d,{get:()=>e[d],enumerable:!(u=me(e,d))||u.enumerable});return m};var j=(m,e,i)=>(i=m!=null?ue(he(m)):{},Se(e||!m||!m.__esModule?V(i,"default",{value:m,enumerable:!0}):i,m));var S=(m,e,i)=>(H(m,typeof e!="symbol"?e+"":e,i),i);var K=ge((Y,w)=>{(function(m){"use strict";function e(t,c){var r=(t&65535)+(c&65535),g=(t>>16)+(c>>16)+(r>>16);return g<<16|r&65535}function i(t,c){return t<<c|t>>>32-c}function u(t,c,r,g,C,T){return e(i(e(e(c,t),e(g,T)),C),r)}function d(t,c,r,g,C,T,f){return u(c&r|~c&g,t,c,C,T,f)}function h(t,c,r,g,C,T,f){return u(c&g|r&~g,t,c,C,T,f)}function l(t,c,r,g,C,T,f){return u(c^r^g,t,c,C,T,f)}function p(t,c,r,g,C,T,f){return u(r^(c|~g),t,c,C,T,f)}function b(t,c){t[c>>5]|=128<<c%32,t[(c+64>>>9<<4)+14]=c;var r,g,C,T,f,o=1732584193,a=-271733879,s=-1732584194,n=271733878;for(r=0;r<t.length;r+=16)g=o,C=a,T=s,f=n,o=d(o,a,s,n,t[r],7,-680876936),n=d(n,o,a,s,t[r+1],12,-389564586),s=d(s,n,o,a,t[r+2],17,606105819),a=d(a,s,n,o,t[r+3],22,-1044525330),o=d(o,a,s,n,t[r+4],7,-176418897),n=d(n,o,a,s,t[r+5],12,1200080426),s=d(s,n,o,a,t[r+6],17,-1473231341),a=d(a,s,n,o,t[r+7],22,-45705983),o=d(o,a,s,n,t[r+8],7,1770035416),n=d(n,o,a,s,t[r+9],12,-1958414417),s=d(s,n,o,a,t[r+10],17,-42063),a=d(a,s,n,o,t[r+11],22,-1990404162),o=d(o,a,s,n,t[r+12],7,1804603682),n=d(n,o,a,s,t[r+13],12,-40341101),s=d(s,n,o,a,t[r+14],17,-1502002290),a=d(a,s,n,o,t[r+15],22,1236535329),o=h(o,a,s,n,t[r+1],5,-165796510),n=h(n,o,a,s,t[r+6],9,-1069501632),s=h(s,n,o,a,t[r+11],14,643717713),a=h(a,s,n,o,t[r],20,-373897302),o=h(o,a,s,n,t[r+5],5,-701558691),n=h(n,o,a,s,t[r+10],9,38016083),s=h(s,n,o,a,t[r+15],14,-660478335),a=h(a,s,n,o,t[r+4],20,-405537848),o=h(o,a,s,n,t[r+9],5,568446438),n=h(n,o,a,s,t[r+14],9,-1019803690),s=h(s,n,o,a,t[r+3],14,-187363961),a=h(a,s,n,o,t[r+8],20,1163531501),o=h(o,a,s,n,t[r+13],5,-1444681467),n=h(n,o,a,s,t[r+2],9,-51403784),s=h(s,n,o,a,t[r+7],14,1735328473),a=h(a,s,n,o,t[r+12],20,-1926607734),o=l(o,a,s,n,t[r+5],4,-378558),n=l(n,o,a,s,t[r+8],11,-2022574463),s=l(s,n,o,a,t[r+11],16,1839030562),a=l(a,s,n,o,t[r+14],23,-35309556),o=l(o,a,s,n,t[r+1],4,-1530992060),n=l(n,o,a,s,t[r+4],11,1272893353),s=l(s,n,o,a,t[r+7],16,-155497632),a=l(a,s,n,o,t[r+10],23,-1094730640),o=l(o,a,s,n,t[r+13],4,681279174),n=l(n,o,a,s,t[r],11,-358537222),s=l(s,n,o,a,t[r+3],16,-722521979),a=l(a,s,n,o,t[r+6],23,76029189),o=l(o,a,s,n,t[r+9],4,-640364487),n=l(n,o,a,s,t[r+12],11,-421815835),s=l(s,n,o,a,t[r+15],16,530742520),a=l(a,s,n,o,t[r+2],23,-995338651),o=p(o,a,s,n,t[r],6,-198630844),n=p(n,o,a,s,t[r+7],10,1126891415),s=p(s,n,o,a,t[r+14],15,-1416354905),a=p(a,s,n,o,t[r+5],21,-57434055),o=p(o,a,s,n,t[r+12],6,1700485571),n=p(n,o,a,s,t[r+3],10,-1894986606),s=p(s,n,o,a,t[r+10],15,-1051523),a=p(a,s,n,o,t[r+1],21,-2054922799),o=p(o,a,s,n,t[r+8],6,1873313359),n=p(n,o,a,s,t[r+15],10,-30611744),s=p(s,n,o,a,t[r+6],15,-1560198380),a=p(a,s,n,o,t[r+13],21,1309151649),o=p(o,a,s,n,t[r+4],6,-145523070),n=p(n,o,a,s,t[r+11],10,-1120210379),s=p(s,n,o,a,t[r+2],15,718787259),a=p(a,s,n,o,t[r+9],21,-343485551),o=e(o,g),a=e(a,C),s=e(s,T),n=e(n,f);return[o,a,s,n]}function _(t){var c,r="",g=t.length*32;for(c=0;c<g;c+=8)r+=String.fromCharCode(t[c>>5]>>>c%32&255);return r}function D(t){var c,r=[];for(r[(t.length>>2)-1]=void 0,c=0;c<r.length;c+=1)r[c]=0;var g=t.length*8;for(c=0;c<g;c+=8)r[c>>5]|=(t.charCodeAt(c/8)&255)<<c%32;return r}function R(t){return _(b(D(t),t.length*8))}function x(t,c){var r,g=D(t),C=[],T=[],f;for(C[15]=T[15]=void 0,g.length>16&&(g=b(g,t.length*8)),r=0;r<16;r+=1)C[r]=g[r]^909522486,T[r]=g[r]^1549556828;return f=b(C.concat(D(c)),512+c.length*8),_(b(T.concat(f),512+128))}function v(t){var c="0123456789abcdef",r="",g,C;for(C=0;C<t.length;C+=1)g=t.charCodeAt(C),r+=c.charAt(g>>>4&15)+c.charAt(g&15);return r}function y(t){return unescape(encodeURIComponent(t))}function O(t){return R(y(t))}function q(t){return v(O(t))}function J(t,c){return x(y(t),y(c))}function ne(t,c){return v(J(t,c))}function $(t,c,r){return c?r?J(c,t):ne(c,t):r?O(t):q(t)}typeof define=="function"&&define.amd?define(function(){return $}):typeof w=="object"&&w.exports?w.exports=$:m.md5=$})(Y)});var Z=j(K(),1);var M=(u=>(u.PublishMainStreamToCDN="publish-main-stream-to-cdn",u.PublishSubStreamToCDN="publish-sub-stream-to-cdn",u.PublishMixStreamToCDN="publish-mix-stream-to-cdn",u))(M||{}),F=(i=>(i.Main="main",i.Sub="sub",i))(F||{});var k={IT_AUDIO_VIDEO:0,IT_PICTURE:2,IT_CANVAS:3,IT_PURE_AUDIO:4,IT_PURE_VIDEO:5};var A=class{constructor(e,i){S(this,"_core");S(this,"_room");S(this,"_log");S(this,"_paramsForGivenCDN");S(this,"_publishGivenCDNData",null);S(this,"_isPublishingGivenCDN",!1);this._core=e,this._room=e.room,this._log=i,this._paramsForGivenCDN=new Map([["publish-main-stream-to-cdn",null],["publish-sub-stream-to-cdn",null],["publish-mix-stream-to-cdn",null]])}async startPublishGivenCDN(e){this._log.info(`[CDNStreaming] startPublishGivenCDN() ${JSON.stringify(e)}`),this._paramsForGivenCDN.set(e.publishMode,e);let i={pushRequestTime:Date.now(),pushAppId:e.appId,pushBizId:e.bizId,pushCdnUrl:e.url,pushStreamType:this.convertStreamType(e==null?void 0:e.publishMode),pushStreamId:e.streamId};this._publishGivenCDNData=i;try{this._isPublishingGivenCDN&&await this.stopPublishGivenCDN();let u=await this._room.sendStartPublishCDN(i,!1),{code:d,message:h}=u.data;if(d===0)this._log.info("[CDNStreaming] server success: start given cdn."),this._isPublishingGivenCDN=!0;else throw this.resetGivenCDN(),this._log.error(`[CDNStreaming] server failed: start given cdn errCode: ${d} errMsg: ${h} options: ${JSON.stringify(e)}`),new Error(`[CDNStreaming] server failed: start given cdn errCode: ${d} errMsg: ${h}`)}catch(u){throw this.resetGivenCDN(),u}}async stopPublishGivenCDN(){if(this._log.info("[CDNStreaming] stopPublishGivenCDN"),!this._isPublishingGivenCDN||!this._publishGivenCDNData){this.resetGivenCDN();return}let{pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:d,pushStreamId:h}=this._publishGivenCDNData,l={pushRequestTime:Date.now(),pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:d,pushStreamId:h},p=await this._room.sendStopPublishCDN(l,!1),{code:b,message:_}=p.data;if(b===0)this._log.info("[CDNStreaming] server success: stop given cdn."),this.resetGivenCDN();else throw this._log.error(`[CDNStreaming] server failed: stop given cdn errCode: ${b} errMsg: ${_} data: ${JSON.stringify(l)}`),new Error(`[CDNStreaming] server failed: stop given cdn errCode: ${b} errMsg: ${_}`)}resetGivenCDN(){this._publishGivenCDNData=null,this._isPublishingGivenCDN=!1}convertStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}};var U=class{constructor(e,i){S(this,"_core");S(this,"_room");S(this,"_log");S(this,"_config",null);S(this,"_data",null);S(this,"_givenCDNManager");this._core=e,this._room=e.room,this._log=i,this.reset()}get isMixing(){return!!this._data}get isStarted(){return!!this._config}get hasCustomCDN(){var e,i,u;return((e=this._config)==null?void 0:e.target.appId)&&((i=this._config)==null?void 0:i.target.bizId)&&((u=this._config)==null?void 0:u.target.url)}async startMixTranscode(e){if(this._log.info(`startMixTranscode: ${JSON.stringify(e)}`),this._config=e,this.installEvents(),!!this._core.room.isJoined)try{let i=this.getInputParam(e),u=this.getOutputParam(e),d=this.getOutputSessionId({config:e,roomId:this._room.roomId,userId:this._room.userId});this.isMixing&&this._data&&d!==this._data.outputSessionId&&(this._log.info("[CDNStreaming] streamId changed, auto stop mixing before start"),await this.doStopMixTranscode()),await this.doStartMixTranscode({outputSessionId:d,inputParam:i,outputParam:u});let{appId:h,bizId:l,url:p,streamId:b=""}=this._config.target;h&&l&&p&&(this._givenCDNManager||(this._givenCDNManager=new A(this._core,this._log)),await this._givenCDNManager.startPublishGivenCDN({publishMode:e.target.publishMode,appId:h,bizId:l,url:p,streamId:b}))}catch(i){throw this.reset(),i}}async doStartMixTranscode({outputSessionId:e,inputParam:i,outputParam:u}){let d={roomId:String(this._room.roomId),mcuRequestTime:Date.now(),outputSessionId:e,inputParam:i,outputParam:u};this._log.info(`[CDNStreaming] doStartMixTranscode: ${JSON.stringify(d)}`);let h=await this._room.sendStartMixTranscode(d),{code:l}=h.data,{message:p}=h.data;if(l===0)this._log.info("[CDNStreaming] server success: start mix"),this._data=d;else throw l===-102083&&(p=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this._log.error(`[CDNStreaming] server failed: start mix errCode: ${l} errMsg: ${p}`),new Error(`[CDNStreaming] server failed: start mix errCode: ${l} errMsg: ${p}`)}async stopMixTranscode(){this._log.info("[CDNStreaming] stopMixTranscode");try{this.isStarted&&this.isMixing&&(await this.doStopMixTranscode(),this._config&&this.hasCustomCDN&&this._givenCDNManager&&await this._givenCDNManager.stopPublishGivenCDN())}catch(e){throw e}this.reset()}async doStopMixTranscode(){let e={mcuRequestTime:Date.now(),outputSessionId:this._data.outputSessionId,streamType:this._data.outputParam.streamType};this._log.info(`[CDNStreaming] doStopMixTranscode: ${JSON.stringify(e)}`);let i=await this._room.sendStopMixTranscode(e),{code:u,message:d}=i.data;if(u===0)this._log.info("[CDNStreaming] server success: stop mix"),this.reset();else throw this._log.error(`[CDNStreaming] server failed: start mix errCode: ${u} errMsg: ${d}`),new Error(`[CDNStreaming] server failed: start mix errCode: ${u} errMsg: ${d}`)}reset(){this._config=null,this._data=null,this.uninstallEvents()}installEvents(){this._core.room.on("joined",this.handleRoomJoined,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.room.off("joined",this.handleRoomJoined,this),this._core.room.off("left",this.handleRoomLeft,this)}async handleRoomJoined(){this._log.info(`[CDNStreaming] handleJoined: ${JSON.stringify(this._config)}`),this.isStarted&&this._config&&await this.startMixTranscode(this._config)}async handleRoomLeft(){this._log.info(`[CDNStreaming] handleRoomLeft: ${JSON.stringify(this._config)}`),this._data=null}getOutputSessionId({config:e,userId:i,roomId:u}){return this._core.utils.isString(e.target.streamId)&&e.target.streamId.length>0?e.target.streamId:(0,Z.default)(`${u}_${i}_main`)}getStringRoomId(e,i){return e?String(e):i}getInputParam(e){let{mix:i={}}=e,{audioMixUserList:u=[],videoLayoutList:d=[]}=i,h=d.map(l=>({userId:l.fixedVideoUser.userId,roomId:this.getStringRoomId(l.fixedVideoUser.roomId,l.fixedVideoUser.strRoomId)||this._core.room.roomId,width:l.width||0,height:l.height||0,locationX:l.locationX||0,locationY:l.locationY||0,zOrder:l.zOrder||1,streamType:l.fixedVideoStreamType==="sub"?1:0,inputType:k.IT_PURE_VIDEO,renderMode:l.fillMode||0}));return u.forEach(l=>{let p=h.findIndex(b=>b.userId===l.userId&&b.room===this.getStringRoomId(l.roomId,l.strRoomId));p!==-1?h[p].inputType=k.IT_AUDIO_VIDEO:h.push({userId:l.userId,roomId:l.roomId||l.strRoomId,inputType:k.IT_PURE_AUDIO})}),h}getOutputParam(e){let i=e.target.streamId||"",{encoding:u={},mix:d={}}=e;return{streamId:i,streamType:i.length>0?1:0,width:this._core.utils.isUndefined(u.videoWidth)?640:u.videoWidth,height:this._core.utils.isUndefined(u.videoHeight)?480:u.videoHeight,videoBps:u.videoBitrate||0,fps:u.videoFramerate||15,gop:u.videoGOP||2,audioSampleRate:u.audioSampleRate||48e3,audioBps:u.audioBitrate||64,audioChannels:u.audioChannels||1,backgroundColor:d.backgroundColor||0,backgroundImg:d.backgroundImage||"",extraInfo:"",videoCodec:2,audioCodec:0}}};var G=j(K(),1);var E=class{constructor(e,i){S(this,"_room");S(this,"_core");S(this,"_log");S(this,"_paramsForTencentCDN");S(this,"_initParamsForTencentCDN",{isPublished:!1,isStarted:!1});this._core=e,this._room=e.room,this._log=i,this._paramsForTencentCDN=new Map([["publish-main-stream-to-cdn",this._initParamsForTencentCDN],["publish-sub-stream-to-cdn",this._initParamsForTencentCDN]])}installEvents(){this._core.innerEmitter.on("104",this.handlePublished,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.innerEmitter.off("104",this.handlePublished,this),this._core.room.off("left",this.handleRoomLeft,this)}async handlePublished({track:e}){var d;this._log.info(`[CDNStreaming] handlePublished: mediaType ${e.mediaType}, roomID ${(d=e==null?void 0:e.room)==null?void 0:d.roomId}`);let i=e.mediaType===4?"publish-main-stream-to-cdn":"publish-sub-stream-to-cdn",u=this._paramsForTencentCDN.get(i)||null;u!=null&&u.target&&u.isStarted&&await this.startPublishTencentCDN(u.target)}async handleRoomLeft(){this._log.info("[CDNStreaming] handleRoomLeft"),this.changeDataStatus("publish-main-stream-to-cdn",{isPublished:!1}),this.changeDataStatus("publish-sub-stream-to-cdn",{isPublished:!1})}isStreamPublished(e){return e==="publish-main-stream-to-cdn"&&!this._room.isMainStreamPublished?(this._log.info("[CDNStreaming] Main stream has not already published, will auto reStart after published."),!1):e==="publish-sub-stream-to-cdn"&&!this._room.isAuxStreamPublished?(this._log.info("[CDNStreaming] Sub has not already published, will auto reStart after published."),!1):!0}changeDataStatus(e,i){let u=this._paramsForTencentCDN.get(e),d=I(I({},u),i);this._paramsForTencentCDN.set(e,d)}async startPublishTencentCDN(e){if(this._log.info(`[CDNStreaming] startPublishTencentCDN ${JSON.stringify(e)}`),this.installEvents(),this.changeDataStatus(e.publishMode,{target:e,isStarted:!0}),!this.isStreamPublished(e.publishMode))return;let i=e.streamId||"",u=this.generatePublishCDNStreamId(i,e.publishMode),d=this.generatePublishCDNSessionId(e.publishMode),h=e.publishMode==="publish-sub-stream-to-cdn"?1:0,l={requestTime:Date.now(),sessionId:d,streamId:u,streamType:h};await this.doStartPublishTencentCDN(l,e.publishMode);let{appId:p,bizId:b,url:_}=e;if(p&&b&&_){let D=this._paramsForTencentCDN.get(e.publishMode)||this._initParamsForTencentCDN;D!=null&&D.givenCDNManager||(D.givenCDNManager=new A(this._core,this._log),this._paramsForTencentCDN.set(e.publishMode,D)),await D.givenCDNManager.startPublishGivenCDN({publishMode:e.publishMode,appId:p,bizId:b,url:_,streamId:u})}}async doStartPublishTencentCDN(e,i){this._log.info(`[CDNStreaming] doStartPublishTencentCDN: ${JSON.stringify(e)}`);let u=6,d=500,h=0;for(;;){let l=await this._room.sendStartPublishCDN(e,!0),{code:p}=l.data,{message:b}=l.data;if(p===0){this._log.info("[CDNStreaming] server success: start tencent cdn"),this.changeDataStatus(i,{isPublished:!0});break}else if(p===-10006&&h<u)this._log.warn(`[CDNStreaming] doStartPublishTencentCDN: retry...${h+1}/6, reason: ${b}`),h+=1,await new Promise(_=>setTimeout(_,d));else throw this.changeDataStatus(i,{isPublished:!1}),p===-102083&&(b=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this._log.error(`[CDNStreaming] server failed: start tencent cdn errCode: ${p} errMsg: ${b}`),new Error(`[CDNStreaming] server failed: start tencent cdn errCode: ${p} errMsg: ${b}`)}}async stopPublishTencentCDN(e){this._log.info(`[CDNStreaming] doStartPublishTencentCDN: ${JSON.stringify(e)}`);let i=this._paramsForTencentCDN.get(e)||this._initParamsForTencentCDN;if(i.isPublished){let{target:u}=i;u!=null&&u.bizId&&u.appId&&u.url&&(i!=null&&i.givenCDNManager)&&await(i==null?void 0:i.givenCDNManager.stopPublishGivenCDN()),await this.doStopPublishTencentCDN(e)}this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}async doStopPublishTencentCDN(e){let i={requestTime:Date.now(),sessionId:(0,G.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)};this._log.info(`[CDNStreaming] doStopPublishTencentCDN: ${JSON.stringify(i)}`);let u=await this._room.sendStopPublishCDN(i,!0),{code:d}=u.data,{message:h}=u.data;if(d===0)this._log.info("[CDNStreaming] server success: stop tencent cdn"),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),this.reset(e);else throw d===-102069&&(this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),h=`can not stop in auto relayed-push mode ${h}`),this._log.error(`[CDNStreaming] server failed: stop tencent cdn errCode: ${d} errMsg: ${h}`),new Error(`[CDNStreaming] server failed: stop tencent cdn errCode: ${d} errMsg: ${h}`)}reset(e){this.uninstallEvents(),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}generatePublishCDNStreamId(e,i){if(e===""){let u=`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(i)}`;return/^[A-Za-z\d_-]*$/.test(u)||(u=(0,G.default)(u)),`${this._room.sdkAppId}_${u}`}return e}convertPublishModeToStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}generatePublishCDNSessionId(e){return(0,G.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)}};var Q=m=>typeof m=="string";function P(m){throw new Error(`[CDNStreaming] options error: ${m}`)}function Ce(m,e,i,u){/^[A-Za-z\d_-]*$/.test(m)||P("Invalid parameter streamId.")}function Te(m,e,i,u){if(Q(m))P("roomId must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.");else{if(m===void 0)return;/^[1-9]\d*$/.test(String(m))&&m<4294967295||P("roomId must be an integer between [1, 4294967294].")}}function De(m,e,i,u){/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(m)||P("strRoomId must be a valid string.")}var N={type:"number",notLessThanZero:!0},ee={type:"object",required:!0,properties:{userId:{required:!0,type:"string"},roomId:{type:["string","number"],validate:Te},strRoomId:{type:"string",validate:De}}},te={required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]},streamId:{required:!1,type:"string",validate:Ce},appId:{type:"number",allowEmpty:!1},bizId:{type:"number",allowEmpty:!1},url:{type:"string",allowEmpty:!1}}},re={required:!1,type:"object",properties:{videoWidth:N,videoHeight:N,videoBitrate:z(I({},N),{allowEmpty:!1}),videoFramerate:{type:"number",validate(m,e,i,u){(m<=0||m>30)&&P("Invalid parameter mixConfig -> videoFramerate, the value must be between (0, 30].")}},videoGOP:{type:"number",validate(m,e,i,u){(m<1||m>8)&&P("Invalid parameter mixConfig -> videoGOP, the value must be between [1, 8].")}},audioSampleRate:N,audioBitrate:{type:"number",validate(m,e,i,u){(m<32||m>192)&&P("Invalid parameter mixConfig -> audioBitrate, the value must be between [32, 192].")}},audioChannels:{type:"number",values:[1,2]}}},ie={required:!1,type:"object",properties:{backgroundColor:{type:"number"},backgroundImage:{type:"string"},audioMixUserList:{type:"array",arrayItem:I({},ee)},videoLayoutList:{type:"array",required:!0,arrayItem:{type:"object",properties:{fixedVideoUser:I({},ee),fixedVideoStreamType:{type:"string",required:!0,values:["main","sub"]},fillMode:{type:"number",values:[0,1,2,4]},zOrder:{type:"number",required:!0,validate(m,e,i,u){(m<1||m>15)&&P("Invalid parameter mix -> videoLayoutList -> zOrder, the value must be between [1, 15].")}},width:N,height:N,locationX:N,locationY:N}}}}};function oe(m){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},te),encoding:I({},re),mix:I({},ie)},validate(e,i,u,d){var b,_;let{publishMode:h}=e.target,{encoding:l,mix:p}=e;if(h==="publish-mix-stream-to-cdn"&&((!l||!p)&&P("Invalid parameter mix & encoding, the value must be not empty."),p&&p.videoLayoutList)){let D=0,R=0,x=[];p.videoLayoutList.forEach((O,q)=>{x.push(O.fixedVideoUser.userId),O.width+O.locationX>D&&(D=O.width+O.locationX),O.height+O.locationY>R&&(R=O.height+O.locationY)}),x.indexOf(m.room.userId)<0&&P("Invalid parameter mix -> videoLayoutList, the value must be include self.");let v=(b=l==null?void 0:l.videoWidth)!=null?b:640,y=(_=l==null?void 0:l.videoHeight)!=null?_:480;(v<D||y<R)&&P("Invalid parameter encoding, the width and height of the mixed video must encompass all the mixed-in video streams.")}}}}function ae(m){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},te),encoding:I({},re),mix:I({},ie)}}}function se(m){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:{required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]}}}}}}var L=0,B=class{constructor(e){this.core=e;S(this,"_mixTranscodeManager");S(this,"_publishCDNManager");S(this,"_core");S(this,"_modeOptions");S(this,"seq");S(this,"_log");L=L+1,this.seq=L,this._log=e.log.createChild({id:`${this.getAlias()}${L}`}),this._log.info(`[CDNStreaming] created id=${this.getAlias()}${L}`),this._core=e,this._modeOptions=new Map,this._mixTranscodeManager=new U(e,this._log),this._publishCDNManager=new E(e,this._log)}getName(){return"CDNStreaming"}getAlias(){return"cdn"}getValidateRule(e){switch(e){case"start":return oe(this._core);case"update":return ae(this._core);case"stop":return se(this._core)}}getGroup(e){return e.target.publishMode}async start(e){return this._modeOptions.set(e.target.publishMode,e),await this.doStart(e)}async update(e){let i=this._modeOptions.get(e.target.publishMode);return this._core.utils.deepMerge(i,e),await this.doStart(i)}async stop(e){switch(e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.stopMixTranscode();break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.stopPublishTencentCDN(e.target.publishMode);break}}this._modeOptions.delete(e.target.publishMode)}async doStart(e){switch(this._log.info(`[CDNStreaming] doStart: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.startMixTranscode(e);break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.startPublishTencentCDN(e.target);break}}}};S(B,"TYPE",{PublishMode:{PublishMainStreamToCDN:"publish-main-stream-to-cdn",PublishSubStreamToCDN:"publish-sub-stream-to-cdn",PublishMixStreamToCDN:"publish-mix-stream-to-cdn"}});var rt=B;export{B as CDNStreaming,M as PublishMode,F as TRTCStreamType,rt as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var CDNStreaming=(()=>{var ue=Object.create;var y=Object.defineProperty,de=Object.defineProperties,me=Object.getOwnPropertyDescriptor,le=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertyNames,q=Object.getOwnPropertySymbols,ce=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var V=(d,e,i)=>e in d?y(d,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):d[e]=i,I=(d,e)=>{for(var i in e||(e={}))X.call(e,i)&&V(d,i,e[i]);if(q)for(var i of q(e))pe.call(e,i)&&V(d,i,e[i]);return d},W=(d,e)=>de(d,le(e));var ge=(d,e)=>()=>(e||d((e={exports:{}}).exports,e),e.exports),be=(d,e)=>{for(var i in e)y(d,i,{get:e[i],enumerable:!0})},z=(d,e,i,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of he(e))!X.call(d,m)&&m!==i&&y(d,m,{get:()=>e[m],enumerable:!(u=me(e,m))||u.enumerable});return d};var j=(d,e,i)=>(i=d!=null?ue(ce(d)):{},z(e||!d||!d.__esModule?y(i,"default",{value:d,enumerable:!0}):i,d)),Se=d=>z(y({},"__esModule",{value:!0}),d);var b=(d,e,i)=>(V(d,typeof e!="symbol"?e+"":e,i),i);var K=ge((Y,w)=>{(function(d){"use strict";function e(t,h){var r=(t&65535)+(h&65535),g=(t>>16)+(h>>16)+(r>>16);return g<<16|r&65535}function i(t,h){return t<<h|t>>>32-h}function u(t,h,r,g,T,C){return e(i(e(e(h,t),e(g,C)),T),r)}function m(t,h,r,g,T,C,f){return u(h&r|~h&g,t,h,T,C,f)}function c(t,h,r,g,T,C,f){return u(h&g|r&~g,t,h,T,C,f)}function l(t,h,r,g,T,C,f){return u(h^r^g,t,h,T,C,f)}function p(t,h,r,g,T,C,f){return u(r^(h|~g),t,h,T,C,f)}function S(t,h){t[h>>5]|=128<<h%32,t[(h+64>>>9<<4)+14]=h;var r,g,T,C,f,o=1732584193,a=-271733879,s=-1732584194,n=271733878;for(r=0;r<t.length;r+=16)g=o,T=a,C=s,f=n,o=m(o,a,s,n,t[r],7,-680876936),n=m(n,o,a,s,t[r+1],12,-389564586),s=m(s,n,o,a,t[r+2],17,606105819),a=m(a,s,n,o,t[r+3],22,-1044525330),o=m(o,a,s,n,t[r+4],7,-176418897),n=m(n,o,a,s,t[r+5],12,1200080426),s=m(s,n,o,a,t[r+6],17,-1473231341),a=m(a,s,n,o,t[r+7],22,-45705983),o=m(o,a,s,n,t[r+8],7,1770035416),n=m(n,o,a,s,t[r+9],12,-1958414417),s=m(s,n,o,a,t[r+10],17,-42063),a=m(a,s,n,o,t[r+11],22,-1990404162),o=m(o,a,s,n,t[r+12],7,1804603682),n=m(n,o,a,s,t[r+13],12,-40341101),s=m(s,n,o,a,t[r+14],17,-1502002290),a=m(a,s,n,o,t[r+15],22,1236535329),o=c(o,a,s,n,t[r+1],5,-165796510),n=c(n,o,a,s,t[r+6],9,-1069501632),s=c(s,n,o,a,t[r+11],14,643717713),a=c(a,s,n,o,t[r],20,-373897302),o=c(o,a,s,n,t[r+5],5,-701558691),n=c(n,o,a,s,t[r+10],9,38016083),s=c(s,n,o,a,t[r+15],14,-660478335),a=c(a,s,n,o,t[r+4],20,-405537848),o=c(o,a,s,n,t[r+9],5,568446438),n=c(n,o,a,s,t[r+14],9,-1019803690),s=c(s,n,o,a,t[r+3],14,-187363961),a=c(a,s,n,o,t[r+8],20,1163531501),o=c(o,a,s,n,t[r+13],5,-1444681467),n=c(n,o,a,s,t[r+2],9,-51403784),s=c(s,n,o,a,t[r+7],14,1735328473),a=c(a,s,n,o,t[r+12],20,-1926607734),o=l(o,a,s,n,t[r+5],4,-378558),n=l(n,o,a,s,t[r+8],11,-2022574463),s=l(s,n,o,a,t[r+11],16,1839030562),a=l(a,s,n,o,t[r+14],23,-35309556),o=l(o,a,s,n,t[r+1],4,-1530992060),n=l(n,o,a,s,t[r+4],11,1272893353),s=l(s,n,o,a,t[r+7],16,-155497632),a=l(a,s,n,o,t[r+10],23,-1094730640),o=l(o,a,s,n,t[r+13],4,681279174),n=l(n,o,a,s,t[r],11,-358537222),s=l(s,n,o,a,t[r+3],16,-722521979),a=l(a,s,n,o,t[r+6],23,76029189),o=l(o,a,s,n,t[r+9],4,-640364487),n=l(n,o,a,s,t[r+12],11,-421815835),s=l(s,n,o,a,t[r+15],16,530742520),a=l(a,s,n,o,t[r+2],23,-995338651),o=p(o,a,s,n,t[r],6,-198630844),n=p(n,o,a,s,t[r+7],10,1126891415),s=p(s,n,o,a,t[r+14],15,-1416354905),a=p(a,s,n,o,t[r+5],21,-57434055),o=p(o,a,s,n,t[r+12],6,1700485571),n=p(n,o,a,s,t[r+3],10,-1894986606),s=p(s,n,o,a,t[r+10],15,-1051523),a=p(a,s,n,o,t[r+1],21,-2054922799),o=p(o,a,s,n,t[r+8],6,1873313359),n=p(n,o,a,s,t[r+15],10,-30611744),s=p(s,n,o,a,t[r+6],15,-1560198380),a=p(a,s,n,o,t[r+13],21,1309151649),o=p(o,a,s,n,t[r+4],6,-145523070),n=p(n,o,a,s,t[r+11],10,-1120210379),s=p(s,n,o,a,t[r+2],15,718787259),a=p(a,s,n,o,t[r+9],21,-343485551),o=e(o,g),a=e(a,T),s=e(s,C),n=e(n,f);return[o,a,s,n]}function _(t){var h,r="",g=t.length*32;for(h=0;h<g;h+=8)r+=String.fromCharCode(t[h>>5]>>>h%32&255);return r}function D(t){var h,r=[];for(r[(t.length>>2)-1]=void 0,h=0;h<r.length;h+=1)r[h]=0;var g=t.length*8;for(h=0;h<g;h+=8)r[h>>5]|=(t.charCodeAt(h/8)&255)<<h%32;return r}function A(t){return _(S(D(t),t.length*8))}function x(t,h){var r,g=D(t),T=[],C=[],f;for(T[15]=C[15]=void 0,g.length>16&&(g=S(g,t.length*8)),r=0;r<16;r+=1)T[r]=g[r]^909522486,C[r]=g[r]^1549556828;return f=S(T.concat(D(h)),512+h.length*8),_(S(C.concat(f),512+128))}function v(t){var h="0123456789abcdef",r="",g,T;for(T=0;T<t.length;T+=1)g=t.charCodeAt(T),r+=h.charAt(g>>>4&15)+h.charAt(g&15);return r}function R(t){return unescape(encodeURIComponent(t))}function P(t){return A(R(t))}function F(t){return v(P(t))}function J(t,h){return x(R(t),R(h))}function ne(t,h){return v(J(t,h))}function H(t,h,r){return h?r?J(h,t):ne(h,t):r?P(t):F(t)}typeof define=="function"&&define.amd?define(function(){return H}):typeof w=="object"&&w.exports?w.exports=H:d.md5=H})(Y)});var Ie={};be(Ie,{CDNStreaming:()=>E,PublishMode:()=>M,TRTCStreamType:()=>G,default:()=>fe});var Z=j(K(),1);var M=(u=>(u.PublishMainStreamToCDN="publish-main-stream-to-cdn",u.PublishSubStreamToCDN="publish-sub-stream-to-cdn",u.PublishMixStreamToCDN="publish-mix-stream-to-cdn",u))(M||{}),G=(i=>(i.Main="main",i.Sub="sub",i))(G||{});var k={IT_AUDIO_VIDEO:0,IT_PICTURE:2,IT_CANVAS:3,IT_PURE_AUDIO:4,IT_PURE_VIDEO:5};var N=class{constructor(e){b(this,"_room");b(this,"_log");b(this,"_paramsForGivenCDN");b(this,"_publishGivenCDNData",null);b(this,"_isPublishingGivenCDN",!1);this._room=e.room,this._log=e.log,this._paramsForGivenCDN=new Map([["publish-main-stream-to-cdn",null],["publish-sub-stream-to-cdn",null],["publish-mix-stream-to-cdn",null]])}async startPublishGivenCDN(e){this._log.info(`startPublishGivenCDN() ${JSON.stringify(e)}`),this._paramsForGivenCDN.set(e.publishMode,e);let i={pushRequestTime:Date.now(),pushAppId:e.appId,pushBizId:e.bizId,pushCdnUrl:e.url,pushStreamType:this.convertStreamType(e==null?void 0:e.publishMode),pushStreamId:e.streamId};this._publishGivenCDNData=i;try{this._isPublishingGivenCDN&&await this.stopPublishGivenCDN();let u=await this._room.sendStartPublishCDN(i,!1),{code:m,message:c}=u.data;if(m===0)this._isPublishingGivenCDN=!0;else throw this.resetGivenCDN(),this._log.error(`startPublishGivenCDN failed, errCode: ${m}, errMsg: ${c}`),new Error(`startPublishGivenCDN failed, errCode: ${m} errMsg: ${c}`)}catch(u){throw this.resetGivenCDN(),u}}async stopPublishGivenCDN(){if(this._log.info(`stopPublishGivenCDN: ${JSON.stringify(this._publishGivenCDNData)}`),!this._isPublishingGivenCDN||!this._publishGivenCDNData){this.resetGivenCDN();return}let{pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:m,pushStreamId:c}=this._publishGivenCDNData,l={pushRequestTime:Date.now(),pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:m,pushStreamId:c},p=await this._room.sendStopPublishCDN(l,!1),{code:S,message:_}=p.data;if(S===0)this.resetGivenCDN();else throw this._log.error(`stopPublishGivenCDN failed, errCode: ${S} errMsg: ${_}`),new Error(`stopPublishGivenCDN failed, errCode: ${S} errMsg: ${_}`)}resetGivenCDN(){this._publishGivenCDNData=null,this._isPublishingGivenCDN=!1}convertStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}};var L=class{constructor(e,i){b(this,"_core");b(this,"_room");b(this,"cdnLog");b(this,"_config",null);b(this,"_data",null);b(this,"_givenCDNManager");this._core=e,this._room=e.room,this.cdnLog=i,this.reset()}get isMixing(){return!!this._data}get isStarted(){return!!this._config}get hasCustomCDN(){var e,i,u;return((e=this._config)==null?void 0:e.target.appId)&&((i=this._config)==null?void 0:i.target.bizId)&&((u=this._config)==null?void 0:u.target.url)}async startMixTranscode(e){if(this.cdnLog.info(`startMixTranscode: ${e}`),this._config=e,this.installEvents(),!!this._core.room.isJoined)try{let i=this.getInputParam(e),u=this.getOutputParam(e),m=this.getOutputSessionId({config:e,roomId:this._room.roomId,userId:this._room.userId});this.isMixing&&this._data&&m!==this._data.outputSessionId&&(this.cdnLog.info("startMixTranscode() streamId changed, stop mixing before start"),await this.doStopMixTranscode()),await this.doStartMixTranscode({outputSessionId:m,inputParam:i,outputParam:u});let{appId:c,bizId:l,url:p,streamId:S=""}=this._config.target;c&&l&&p&&(this._givenCDNManager||(this._givenCDNManager=new N(this._core)),await this._givenCDNManager.startPublishGivenCDN({publishMode:e.target.publishMode,appId:c,bizId:l,url:p,streamId:S}))}catch(i){throw this.reset(),i}}async doStartMixTranscode({outputSessionId:e,inputParam:i,outputParam:u}){let m={roomId:String(this._room.roomId),mcuRequestTime:Date.now(),outputSessionId:e,inputParam:i,outputParam:u};this.cdnLog.info(`doStartMixTranscode: ${JSON.stringify(m)}`);let c=await this._room.sendStartMixTranscode(m),{code:l}=c.data,{message:p}=c.data;if(l===0)this._data=m;else throw l===-102083&&(p=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this.cdnLog.error(`startMixTranscode failed, errCode: ${l} errMsg: ${p}`),new Error(`startMixTranscode failed, errCode: ${l} errMsg: ${p}`)}async stopMixTranscode(){this.cdnLog.info(`stopMixTranscode: ${this.isMixing}`);try{this.isStarted&&this.isMixing&&(await this.doStopMixTranscode(),this._config&&this.hasCustomCDN&&this._givenCDNManager&&await this._givenCDNManager.stopPublishGivenCDN())}catch(e){throw e}this.reset()}async doStopMixTranscode(){let e={mcuRequestTime:Date.now(),outputSessionId:this._data.outputSessionId,streamType:this._data.outputParam.streamType};this.cdnLog.info(`doStopMixTranscode: ${JSON.stringify(e)}`);let i=await this._room.sendStopMixTranscode(e),{code:u,message:m}=i.data;if(u===0)this.reset();else throw this.cdnLog.error(`stopMixTranscode failed, errCode: ${u} errMsg: ${m}`),new Error(`stopMixTranscode failed, errCode: ${u} errMsg: ${m}`)}reset(){this._config=null,this._data=null,this.uninstallEvents()}installEvents(){this._core.room.on("joined",this.handleRoomJoined,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.room.off("joined",this.handleRoomJoined,this),this._core.room.off("left",this.handleRoomLeft,this)}async handleRoomJoined(){this.cdnLog.info(`handleJoined() ${JSON.stringify(this._config)}`),this.isStarted&&this._config&&await this.startMixTranscode(this._config)}async handleRoomLeft(){this.cdnLog.info(`handleJoined() ${JSON.stringify(this._config)}`),this._data=null}getOutputSessionId({config:e,userId:i,roomId:u}){return this._core.utils.isString(e.target.streamId)&&e.target.streamId.length>0?e.target.streamId:(0,Z.default)(`${u}_${i}_main`)}getStringRoomId(e,i){return e?String(e):i}getInputParam(e){let{mix:i={}}=e,{audioMixUserList:u=[],videoLayoutList:m=[]}=i,c=m.map(l=>({userId:l.fixedVideoUser.userId,roomId:this.getStringRoomId(l.fixedVideoUser.roomId,l.fixedVideoUser.strRoomId)||this._core.room.roomId,width:l.width||0,height:l.height||0,locationX:l.locationX||0,locationY:l.locationY||0,zOrder:l.zOrder||1,streamType:l.fixedVideoStreamType==="sub"?1:0,inputType:k.IT_PURE_VIDEO,renderMode:l.fillMode||0}));return u.forEach(l=>{let p=c.findIndex(S=>S.userId===l.userId&&S.room===this.getStringRoomId(l.roomId,l.strRoomId));p!==-1?c[p].inputType=k.IT_AUDIO_VIDEO:c.push({userId:l.userId,roomId:l.roomId||l.strRoomId,inputType:k.IT_PURE_AUDIO})}),c}getOutputParam(e){let i=e.target.streamId||"",{encoding:u={},mix:m={}}=e;return{streamId:i,streamType:i.length>0?1:0,width:this._core.utils.isUndefined(u.videoWidth)?640:u.videoWidth,height:this._core.utils.isUndefined(u.videoHeight)?480:u.videoHeight,videoBps:u.videoBitrate||0,fps:u.videoFramerate||15,gop:u.videoGOP||2,audioSampleRate:u.audioSampleRate||48e3,audioBps:u.audioBitrate||64,audioChannels:u.audioChannels||1,backgroundColor:m.backgroundColor||0,backgroundImg:m.backgroundImage||"",extraInfo:"",videoCodec:2,audioCodec:0}}};var B=j(K(),1);var U=class{constructor(e,i){b(this,"_core");b(this,"_room");b(this,"cdnLog");b(this,"_paramsForTencentCDN");b(this,"_initParamsForTencentCDN",{isPublished:!1,isStarted:!1});this._core=e,this._room=e.room,this.cdnLog=i,this._paramsForTencentCDN=new Map([["publish-main-stream-to-cdn",this._initParamsForTencentCDN],["publish-sub-stream-to-cdn",this._initParamsForTencentCDN]])}installEvents(){this._core.innerEmitter.on("104",this.handlePublished,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.innerEmitter.off("104",this.handlePublished,this),this._core.room.off("left",this.handleRoomLeft,this)}async handlePublished({track:e}){var m;this.cdnLog.info(`handlePublished: mediaType ${e.mediaType}, roomID ${(m=e==null?void 0:e.room)==null?void 0:m.roomId}`);let i=e.mediaType===4?"publish-main-stream-to-cdn":"publish-sub-stream-to-cdn",u=this._paramsForTencentCDN.get(i)||null;u!=null&&u.target&&u.isStarted&&await this.startPublishTencentCDN(u.target)}async handleRoomLeft(){this.changeDataStatus("publish-main-stream-to-cdn",{isPublished:!1}),this.changeDataStatus("publish-sub-stream-to-cdn",{isPublished:!1})}isStreamPublished(e){return e==="publish-main-stream-to-cdn"&&!this._room.isMainStreamPublished?(this.cdnLog.info("Main stream has not already published, will auto reStart after published."),!1):e==="publish-sub-stream-to-cdn"&&!this._room.isAuxStreamPublished?(this.cdnLog.info("Sub has not already published, will auto reStart after published."),!1):!0}changeDataStatus(e,i){let u=this._paramsForTencentCDN.get(e),m=I(I({},u),i);this._paramsForTencentCDN.set(e,m)}async startPublishTencentCDN(e){if(this.cdnLog.info(`startPublishTencentCDN ${JSON.stringify(e)}`),this.installEvents(),this.changeDataStatus(e.publishMode,{target:e,isStarted:!0}),!this.isStreamPublished(e.publishMode))return;let i=e.streamId||"",u=this.generatePublishCDNStreamId(i,e.publishMode),m=this.generatePublishCDNSessionId(e.publishMode),c=e.publishMode==="publish-sub-stream-to-cdn"?1:0,l={requestTime:Date.now(),sessionId:m,streamId:u,streamType:c};await this.doStartPublishTencentCDN(l,e.publishMode);let{appId:p,bizId:S,url:_}=e;if(p&&S&&_){let D=this._paramsForTencentCDN.get(e.publishMode)||this._initParamsForTencentCDN;D!=null&&D.givenCDNManager||(D.givenCDNManager=new N(this._core),this._paramsForTencentCDN.set(e.publishMode,D)),await D.givenCDNManager.startPublishGivenCDN({publishMode:e.publishMode,appId:p,bizId:S,url:_,streamId:u})}}async doStartPublishTencentCDN(e,i){this.cdnLog.info(`doStartPublishTencentCDN: ${JSON.stringify(e)}`);try{let c=0;for(;;){let l=await this._room.sendStartPublishCDN(e,!0),{code:p}=l.data,{message:S}=l.data;if(p===0){this.cdnLog.info(`doStartPublishTencentCDN: success ${JSON.stringify(l)}`),this.changeDataStatus(i,{isPublished:!0});break}else if(p===-10006&&c<6)this.cdnLog.warn(`doStartPublishTencentCDN: retry...${c+1}/6, reason: ${S}`),c+=1,await new Promise(_=>setTimeout(_,500));else throw this.changeDataStatus(i,{isPublished:!1}),p===-102083&&(S=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),new Error(`startPublishTencentCDN failed, errCode: ${p} errMsg: ${S}`)}}catch(u){throw this.cdnLog.error(`startPublishTencentCDN failed, error: ${u}`),this.changeDataStatus(i,{isPublished:!1}),u}}async stopPublishTencentCDN(e){let i=this._paramsForTencentCDN.get(e)||this._initParamsForTencentCDN;if(i.isPublished){let{target:u}=i;u!=null&&u.bizId&&u.appId&&u.url&&(i!=null&&i.givenCDNManager)&&await(i==null?void 0:i.givenCDNManager.stopPublishGivenCDN()),await this.doStopPublishTencentCDN(e)}this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}async doStopPublishTencentCDN(e){let i={requestTime:Date.now(),sessionId:(0,B.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)};this.cdnLog.info(`stopPublishTencentCDN: ${JSON.stringify(i)}`);let u=await this._room.sendStopPublishCDN(i,!0),{code:m,message:c}=u.data;if(m===0)this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),this.reset(e);else if(m===-102069)this.cdnLog.error("stopPublishTencentCDN failed, can not stopPublishTencentCDN in auto relayed-push mode"),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN);else throw this.cdnLog.error(`stopPublishTencentCDN failed, errCode: ${m} errMsg: ${c}`),new Error(`stopPublishTencentCDN failed, errCode: ${m} errMsg: ${c}`)}reset(e){this.uninstallEvents(),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}generatePublishCDNStreamId(e,i){if(e===""){let u=`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(i)}`;return/^[A-Za-z\d_-]*$/.test(u)||(u=(0,B.default)(u)),`${this._room.sdkAppId}_${u}`}return e}convertPublishModeToStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}generatePublishCDNSessionId(e){return(0,B.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)}};var Q=d=>typeof d=="string";function Ce(d,e,i,u){if(!/^[A-Za-z\d_-]*$/.test(d))throw new Error("Invalid parameter streamId.")}function De(d,e,i,u){if(Q(d))throw new Error("roomId must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.");if(d===void 0)return;if(!(/^[1-9]\d*$/.test(String(d))&&d<4294967295))throw new Error("roomId must be an integer between [1, 4294967294].")}function _e(d,e,i,u){if(!/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(d))throw new Error("strRoomId must be a valid string.")}var O={type:"number",notLessThanZero:!0},ee={type:"object",required:!0,properties:{userId:{required:!0,type:"string"},roomId:{type:["string","number"],validate:De},strRoomId:{type:"string",validate:_e}}},te={required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]},streamId:{required:!1,type:"string",validate:Ce},appId:{type:"number",allowEmpty:!1},bizId:{type:"number",allowEmpty:!1},url:{type:"string",allowEmpty:!1}}},re={required:!1,type:"object",properties:{videoWidth:O,videoHeight:O,videoBitrate:W(I({},O),{allowEmpty:!1}),videoFramerate:{type:"number",validate(d,e,i,u){if(d<=0||d>30)throw new Error("Invalid parameter mixConfig -> videoFramerate, the value must be between (0, 30].")}},videoGOP:{type:"number",validate(d,e,i,u){if(d<1||d>8)throw new Error("Invalid parameter mixConfig -> videoGOP, the value must be between [1, 8].")}},audioSampleRate:O,audioBitrate:{type:"number",validate(d,e,i,u){if(d<32||d>192)throw new Error("Invalid parameter mixConfig -> audioBitrate, the value must be between [32, 192].")}},audioChannels:{type:"number",values:[1,2]}}},ie={required:!1,type:"object",properties:{backgroundColor:{type:"number"},backgroundImage:{type:"string"},audioMixUserList:{type:"array",arrayItem:I({},ee)},videoLayoutList:{type:"array",required:!0,arrayItem:{type:"object",properties:{fixedVideoUser:I({},ee),fixedVideoStreamType:{type:"string",required:!0,values:["main","sub"]},fillMode:{type:"number",values:[0,1,2,4]},zOrder:{type:"number",required:!0,validate(d,e,i,u){if(d<1||d>15)throw new Error("Invalid parameter mix -> videoLayoutList -> zOrder, the value must be between [1, 15].")}},width:O,height:O,locationX:O,locationY:O}}}}};function oe(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},te),encoding:I({},re),mix:I({},ie)},validate(e,i,u,m){var S,_;let{publishMode:c}=e.target,{encoding:l,mix:p}=e;if(c==="publish-mix-stream-to-cdn"){if(!l||!p)throw new Error("Invalid parameter mix & encoding, the value must be not empty.");if(p&&p.videoLayoutList){let D=0,A=0,x=[];if(p.videoLayoutList.forEach((P,F)=>{x.push(P.fixedVideoUser.userId),P.width+P.locationX>D&&(D=P.width+P.locationX),P.height+P.locationY>A&&(A=P.height+P.locationY)}),x.indexOf(d.room.userId)<0)throw new Error("Invalid parameter mix -> videoLayoutList, the value must be include self.");let v=(S=l==null?void 0:l.videoWidth)!=null?S:640,R=(_=l==null?void 0:l.videoHeight)!=null?_:480;if(v<D||R<A)throw new Error("Invalid parameter encoding, the width and height of the mixed video must encompass all the mixed-in video streams.")}}}}}function ae(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},te),encoding:I({},re),mix:I({},ie)}}}function se(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:{required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]}}}}}}var $=0,E=class{constructor(e){this.core=e;b(this,"_mixTranscodeManager");b(this,"_publishCDNManager");b(this,"_core");b(this,"cdnLog");b(this,"_modeOptions");b(this,"seq");$=$+1,this.seq=$,this.cdnLog=e.log.createChild({id:`${this.getAlias()}${$}`}),this._core=e,this.cdnLog.info("CDNStreaming created"),this._modeOptions=new Map,this._mixTranscodeManager=new L(e,this.cdnLog),this._publishCDNManager=new U(e,this.cdnLog)}getName(){return"CDNStreaming"}getAlias(){return"cdn"}getValidateRule(e){switch(e){case"start":return oe(this._core);case"update":return ae(this._core);case"stop":return se(this._core)}}getGroup(e){return e.target.publishMode}async start(e){return this.cdnLog.info(`Plugin CDNStreaming start: ${JSON.stringify(e)}`),this._modeOptions.set(e.target.publishMode,e),await this.doStart(e)}async update(e){this.cdnLog.info(`Plugin CDNStreaming update: ${JSON.stringify(e)}`);let i=this._modeOptions.get(e.target.publishMode);return this._core.utils.deepMerge(i,e),await this.doStart(i)}async stop(e){switch(this.cdnLog.info(`Plugin CDNStreaming stop: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.stopMixTranscode();break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.stopPublishTencentCDN(e.target.publishMode);break}}this._modeOptions.delete(e.target.publishMode)}async doStart(e){switch(this.cdnLog.info(`Plugin CDNStreaming doStart: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.startMixTranscode(e);break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.startPublishTencentCDN(e.target);break}}}};b(E,"TYPE",{PublishMode:{PublishMainStreamToCDN:"publish-main-stream-to-cdn",PublishSubStreamToCDN:"publish-sub-stream-to-cdn",PublishMixStreamToCDN:"publish-mix-stream-to-cdn"}});var fe=E;return Se(Ie);})().default;
|
|
1
|
+
"use strict";var CDNStreaming=(()=>{var de=Object.create;var U=Object.defineProperty,me=Object.defineProperties,le=Object.getOwnPropertyDescriptor,ce=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols,pe=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty,ge=Object.prototype.propertyIsEnumerable;var K=(d,e,i)=>e in d?U(d,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):d[e]=i,I=(d,e)=>{for(var i in e||(e={}))W.call(e,i)&&K(d,i,e[i]);if(X)for(var i of X(e))ge.call(e,i)&&K(d,i,e[i]);return d},z=(d,e)=>me(d,ce(e));var Se=(d,e)=>()=>(e||d((e={exports:{}}).exports,e),e.exports),be=(d,e)=>{for(var i in e)U(d,i,{get:e[i],enumerable:!0})},j=(d,e,i,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of he(e))!W.call(d,m)&&m!==i&&U(d,m,{get:()=>e[m],enumerable:!(u=le(e,m))||u.enumerable});return d};var Y=(d,e,i)=>(i=d!=null?de(pe(d)):{},j(e||!d||!d.__esModule?U(i,"default",{value:d,enumerable:!0}):i,d)),Ce=d=>j(U({},"__esModule",{value:!0}),d);var S=(d,e,i)=>(K(d,typeof e!="symbol"?e+"":e,i),i);var F=Se((Z,G)=>{(function(d){"use strict";function e(t,c){var r=(t&65535)+(c&65535),g=(t>>16)+(c>>16)+(r>>16);return g<<16|r&65535}function i(t,c){return t<<c|t>>>32-c}function u(t,c,r,g,C,T){return e(i(e(e(c,t),e(g,T)),C),r)}function m(t,c,r,g,C,T,f){return u(c&r|~c&g,t,c,C,T,f)}function h(t,c,r,g,C,T,f){return u(c&g|r&~g,t,c,C,T,f)}function l(t,c,r,g,C,T,f){return u(c^r^g,t,c,C,T,f)}function p(t,c,r,g,C,T,f){return u(r^(c|~g),t,c,C,T,f)}function b(t,c){t[c>>5]|=128<<c%32,t[(c+64>>>9<<4)+14]=c;var r,g,C,T,f,o=1732584193,a=-271733879,s=-1732584194,n=271733878;for(r=0;r<t.length;r+=16)g=o,C=a,T=s,f=n,o=m(o,a,s,n,t[r],7,-680876936),n=m(n,o,a,s,t[r+1],12,-389564586),s=m(s,n,o,a,t[r+2],17,606105819),a=m(a,s,n,o,t[r+3],22,-1044525330),o=m(o,a,s,n,t[r+4],7,-176418897),n=m(n,o,a,s,t[r+5],12,1200080426),s=m(s,n,o,a,t[r+6],17,-1473231341),a=m(a,s,n,o,t[r+7],22,-45705983),o=m(o,a,s,n,t[r+8],7,1770035416),n=m(n,o,a,s,t[r+9],12,-1958414417),s=m(s,n,o,a,t[r+10],17,-42063),a=m(a,s,n,o,t[r+11],22,-1990404162),o=m(o,a,s,n,t[r+12],7,1804603682),n=m(n,o,a,s,t[r+13],12,-40341101),s=m(s,n,o,a,t[r+14],17,-1502002290),a=m(a,s,n,o,t[r+15],22,1236535329),o=h(o,a,s,n,t[r+1],5,-165796510),n=h(n,o,a,s,t[r+6],9,-1069501632),s=h(s,n,o,a,t[r+11],14,643717713),a=h(a,s,n,o,t[r],20,-373897302),o=h(o,a,s,n,t[r+5],5,-701558691),n=h(n,o,a,s,t[r+10],9,38016083),s=h(s,n,o,a,t[r+15],14,-660478335),a=h(a,s,n,o,t[r+4],20,-405537848),o=h(o,a,s,n,t[r+9],5,568446438),n=h(n,o,a,s,t[r+14],9,-1019803690),s=h(s,n,o,a,t[r+3],14,-187363961),a=h(a,s,n,o,t[r+8],20,1163531501),o=h(o,a,s,n,t[r+13],5,-1444681467),n=h(n,o,a,s,t[r+2],9,-51403784),s=h(s,n,o,a,t[r+7],14,1735328473),a=h(a,s,n,o,t[r+12],20,-1926607734),o=l(o,a,s,n,t[r+5],4,-378558),n=l(n,o,a,s,t[r+8],11,-2022574463),s=l(s,n,o,a,t[r+11],16,1839030562),a=l(a,s,n,o,t[r+14],23,-35309556),o=l(o,a,s,n,t[r+1],4,-1530992060),n=l(n,o,a,s,t[r+4],11,1272893353),s=l(s,n,o,a,t[r+7],16,-155497632),a=l(a,s,n,o,t[r+10],23,-1094730640),o=l(o,a,s,n,t[r+13],4,681279174),n=l(n,o,a,s,t[r],11,-358537222),s=l(s,n,o,a,t[r+3],16,-722521979),a=l(a,s,n,o,t[r+6],23,76029189),o=l(o,a,s,n,t[r+9],4,-640364487),n=l(n,o,a,s,t[r+12],11,-421815835),s=l(s,n,o,a,t[r+15],16,530742520),a=l(a,s,n,o,t[r+2],23,-995338651),o=p(o,a,s,n,t[r],6,-198630844),n=p(n,o,a,s,t[r+7],10,1126891415),s=p(s,n,o,a,t[r+14],15,-1416354905),a=p(a,s,n,o,t[r+5],21,-57434055),o=p(o,a,s,n,t[r+12],6,1700485571),n=p(n,o,a,s,t[r+3],10,-1894986606),s=p(s,n,o,a,t[r+10],15,-1051523),a=p(a,s,n,o,t[r+1],21,-2054922799),o=p(o,a,s,n,t[r+8],6,1873313359),n=p(n,o,a,s,t[r+15],10,-30611744),s=p(s,n,o,a,t[r+6],15,-1560198380),a=p(a,s,n,o,t[r+13],21,1309151649),o=p(o,a,s,n,t[r+4],6,-145523070),n=p(n,o,a,s,t[r+11],10,-1120210379),s=p(s,n,o,a,t[r+2],15,718787259),a=p(a,s,n,o,t[r+9],21,-343485551),o=e(o,g),a=e(a,C),s=e(s,T),n=e(n,f);return[o,a,s,n]}function _(t){var c,r="",g=t.length*32;for(c=0;c<g;c+=8)r+=String.fromCharCode(t[c>>5]>>>c%32&255);return r}function D(t){var c,r=[];for(r[(t.length>>2)-1]=void 0,c=0;c<r.length;c+=1)r[c]=0;var g=t.length*8;for(c=0;c<g;c+=8)r[c>>5]|=(t.charCodeAt(c/8)&255)<<c%32;return r}function R(t){return _(b(D(t),t.length*8))}function w(t,c){var r,g=D(t),C=[],T=[],f;for(C[15]=T[15]=void 0,g.length>16&&(g=b(g,t.length*8)),r=0;r<16;r+=1)C[r]=g[r]^909522486,T[r]=g[r]^1549556828;return f=b(C.concat(D(c)),512+c.length*8),_(b(T.concat(f),512+128))}function k(t){var c="0123456789abcdef",r="",g,C;for(C=0;C<t.length;C+=1)g=t.charCodeAt(C),r+=c.charAt(g>>>4&15)+c.charAt(g&15);return r}function y(t){return unescape(encodeURIComponent(t))}function O(t){return R(y(t))}function q(t){return k(O(t))}function J(t,c){return w(y(t),y(c))}function ue(t,c){return k(J(t,c))}function V(t,c,r){return c?r?J(c,t):ue(c,t):r?O(t):q(t)}typeof define=="function"&&define.amd?define(function(){return V}):typeof G=="object"&&G.exports?G.exports=V:d.md5=V})(Z)});var Oe={};be(Oe,{CDNStreaming:()=>v,PublishMode:()=>A,TRTCStreamType:()=>B,default:()=>Ie});var Q=Y(F(),1);var A=(u=>(u.PublishMainStreamToCDN="publish-main-stream-to-cdn",u.PublishSubStreamToCDN="publish-sub-stream-to-cdn",u.PublishMixStreamToCDN="publish-mix-stream-to-cdn",u))(A||{}),B=(i=>(i.Main="main",i.Sub="sub",i))(B||{});var $={IT_AUDIO_VIDEO:0,IT_PICTURE:2,IT_CANVAS:3,IT_PURE_AUDIO:4,IT_PURE_VIDEO:5};var M=class{constructor(e,i){S(this,"_core");S(this,"_room");S(this,"_log");S(this,"_paramsForGivenCDN");S(this,"_publishGivenCDNData",null);S(this,"_isPublishingGivenCDN",!1);this._core=e,this._room=e.room,this._log=i,this._paramsForGivenCDN=new Map([["publish-main-stream-to-cdn",null],["publish-sub-stream-to-cdn",null],["publish-mix-stream-to-cdn",null]])}async startPublishGivenCDN(e){this._log.info(`[CDNStreaming] startPublishGivenCDN() ${JSON.stringify(e)}`),this._paramsForGivenCDN.set(e.publishMode,e);let i={pushRequestTime:Date.now(),pushAppId:e.appId,pushBizId:e.bizId,pushCdnUrl:e.url,pushStreamType:this.convertStreamType(e==null?void 0:e.publishMode),pushStreamId:e.streamId};this._publishGivenCDNData=i;try{this._isPublishingGivenCDN&&await this.stopPublishGivenCDN();let u=await this._room.sendStartPublishCDN(i,!1),{code:m,message:h}=u.data;if(m===0)this._log.info("[CDNStreaming] server success: start given cdn."),this._isPublishingGivenCDN=!0;else throw this.resetGivenCDN(),this._log.error(`[CDNStreaming] server failed: start given cdn errCode: ${m} errMsg: ${h} options: ${JSON.stringify(e)}`),new Error(`[CDNStreaming] server failed: start given cdn errCode: ${m} errMsg: ${h}`)}catch(u){throw this.resetGivenCDN(),u}}async stopPublishGivenCDN(){if(this._log.info("[CDNStreaming] stopPublishGivenCDN"),!this._isPublishingGivenCDN||!this._publishGivenCDNData){this.resetGivenCDN();return}let{pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:m,pushStreamId:h}=this._publishGivenCDNData,l={pushRequestTime:Date.now(),pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:m,pushStreamId:h},p=await this._room.sendStopPublishCDN(l,!1),{code:b,message:_}=p.data;if(b===0)this._log.info("[CDNStreaming] server success: stop given cdn."),this.resetGivenCDN();else throw this._log.error(`[CDNStreaming] server failed: stop given cdn errCode: ${b} errMsg: ${_} data: ${JSON.stringify(l)}`),new Error(`[CDNStreaming] server failed: stop given cdn errCode: ${b} errMsg: ${_}`)}resetGivenCDN(){this._publishGivenCDNData=null,this._isPublishingGivenCDN=!1}convertStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}};var E=class{constructor(e,i){S(this,"_core");S(this,"_room");S(this,"_log");S(this,"_config",null);S(this,"_data",null);S(this,"_givenCDNManager");this._core=e,this._room=e.room,this._log=i,this.reset()}get isMixing(){return!!this._data}get isStarted(){return!!this._config}get hasCustomCDN(){var e,i,u;return((e=this._config)==null?void 0:e.target.appId)&&((i=this._config)==null?void 0:i.target.bizId)&&((u=this._config)==null?void 0:u.target.url)}async startMixTranscode(e){if(this._log.info(`startMixTranscode: ${JSON.stringify(e)}`),this._config=e,this.installEvents(),!!this._core.room.isJoined)try{let i=this.getInputParam(e),u=this.getOutputParam(e),m=this.getOutputSessionId({config:e,roomId:this._room.roomId,userId:this._room.userId});this.isMixing&&this._data&&m!==this._data.outputSessionId&&(this._log.info("[CDNStreaming] streamId changed, auto stop mixing before start"),await this.doStopMixTranscode()),await this.doStartMixTranscode({outputSessionId:m,inputParam:i,outputParam:u});let{appId:h,bizId:l,url:p,streamId:b=""}=this._config.target;h&&l&&p&&(this._givenCDNManager||(this._givenCDNManager=new M(this._core,this._log)),await this._givenCDNManager.startPublishGivenCDN({publishMode:e.target.publishMode,appId:h,bizId:l,url:p,streamId:b}))}catch(i){throw this.reset(),i}}async doStartMixTranscode({outputSessionId:e,inputParam:i,outputParam:u}){let m={roomId:String(this._room.roomId),mcuRequestTime:Date.now(),outputSessionId:e,inputParam:i,outputParam:u};this._log.info(`[CDNStreaming] doStartMixTranscode: ${JSON.stringify(m)}`);let h=await this._room.sendStartMixTranscode(m),{code:l}=h.data,{message:p}=h.data;if(l===0)this._log.info("[CDNStreaming] server success: start mix"),this._data=m;else throw l===-102083&&(p=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this._log.error(`[CDNStreaming] server failed: start mix errCode: ${l} errMsg: ${p}`),new Error(`[CDNStreaming] server failed: start mix errCode: ${l} errMsg: ${p}`)}async stopMixTranscode(){this._log.info("[CDNStreaming] stopMixTranscode");try{this.isStarted&&this.isMixing&&(await this.doStopMixTranscode(),this._config&&this.hasCustomCDN&&this._givenCDNManager&&await this._givenCDNManager.stopPublishGivenCDN())}catch(e){throw e}this.reset()}async doStopMixTranscode(){let e={mcuRequestTime:Date.now(),outputSessionId:this._data.outputSessionId,streamType:this._data.outputParam.streamType};this._log.info(`[CDNStreaming] doStopMixTranscode: ${JSON.stringify(e)}`);let i=await this._room.sendStopMixTranscode(e),{code:u,message:m}=i.data;if(u===0)this._log.info("[CDNStreaming] server success: stop mix"),this.reset();else throw this._log.error(`[CDNStreaming] server failed: start mix errCode: ${u} errMsg: ${m}`),new Error(`[CDNStreaming] server failed: start mix errCode: ${u} errMsg: ${m}`)}reset(){this._config=null,this._data=null,this.uninstallEvents()}installEvents(){this._core.room.on("joined",this.handleRoomJoined,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.room.off("joined",this.handleRoomJoined,this),this._core.room.off("left",this.handleRoomLeft,this)}async handleRoomJoined(){this._log.info(`[CDNStreaming] handleJoined: ${JSON.stringify(this._config)}`),this.isStarted&&this._config&&await this.startMixTranscode(this._config)}async handleRoomLeft(){this._log.info(`[CDNStreaming] handleRoomLeft: ${JSON.stringify(this._config)}`),this._data=null}getOutputSessionId({config:e,userId:i,roomId:u}){return this._core.utils.isString(e.target.streamId)&&e.target.streamId.length>0?e.target.streamId:(0,Q.default)(`${u}_${i}_main`)}getStringRoomId(e,i){return e?String(e):i}getInputParam(e){let{mix:i={}}=e,{audioMixUserList:u=[],videoLayoutList:m=[]}=i,h=m.map(l=>({userId:l.fixedVideoUser.userId,roomId:this.getStringRoomId(l.fixedVideoUser.roomId,l.fixedVideoUser.strRoomId)||this._core.room.roomId,width:l.width||0,height:l.height||0,locationX:l.locationX||0,locationY:l.locationY||0,zOrder:l.zOrder||1,streamType:l.fixedVideoStreamType==="sub"?1:0,inputType:$.IT_PURE_VIDEO,renderMode:l.fillMode||0}));return u.forEach(l=>{let p=h.findIndex(b=>b.userId===l.userId&&b.room===this.getStringRoomId(l.roomId,l.strRoomId));p!==-1?h[p].inputType=$.IT_AUDIO_VIDEO:h.push({userId:l.userId,roomId:l.roomId||l.strRoomId,inputType:$.IT_PURE_AUDIO})}),h}getOutputParam(e){let i=e.target.streamId||"",{encoding:u={},mix:m={}}=e;return{streamId:i,streamType:i.length>0?1:0,width:this._core.utils.isUndefined(u.videoWidth)?640:u.videoWidth,height:this._core.utils.isUndefined(u.videoHeight)?480:u.videoHeight,videoBps:u.videoBitrate||0,fps:u.videoFramerate||15,gop:u.videoGOP||2,audioSampleRate:u.audioSampleRate||48e3,audioBps:u.audioBitrate||64,audioChannels:u.audioChannels||1,backgroundColor:m.backgroundColor||0,backgroundImg:m.backgroundImage||"",extraInfo:"",videoCodec:2,audioCodec:0}}};var H=Y(F(),1);var L=class{constructor(e,i){S(this,"_room");S(this,"_core");S(this,"_log");S(this,"_paramsForTencentCDN");S(this,"_initParamsForTencentCDN",{isPublished:!1,isStarted:!1});this._core=e,this._room=e.room,this._log=i,this._paramsForTencentCDN=new Map([["publish-main-stream-to-cdn",this._initParamsForTencentCDN],["publish-sub-stream-to-cdn",this._initParamsForTencentCDN]])}installEvents(){this._core.innerEmitter.on("104",this.handlePublished,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.innerEmitter.off("104",this.handlePublished,this),this._core.room.off("left",this.handleRoomLeft,this)}async handlePublished({track:e}){var m;this._log.info(`[CDNStreaming] handlePublished: mediaType ${e.mediaType}, roomID ${(m=e==null?void 0:e.room)==null?void 0:m.roomId}`);let i=e.mediaType===4?"publish-main-stream-to-cdn":"publish-sub-stream-to-cdn",u=this._paramsForTencentCDN.get(i)||null;u!=null&&u.target&&u.isStarted&&await this.startPublishTencentCDN(u.target)}async handleRoomLeft(){this._log.info("[CDNStreaming] handleRoomLeft"),this.changeDataStatus("publish-main-stream-to-cdn",{isPublished:!1}),this.changeDataStatus("publish-sub-stream-to-cdn",{isPublished:!1})}isStreamPublished(e){return e==="publish-main-stream-to-cdn"&&!this._room.isMainStreamPublished?(this._log.info("[CDNStreaming] Main stream has not already published, will auto reStart after published."),!1):e==="publish-sub-stream-to-cdn"&&!this._room.isAuxStreamPublished?(this._log.info("[CDNStreaming] Sub has not already published, will auto reStart after published."),!1):!0}changeDataStatus(e,i){let u=this._paramsForTencentCDN.get(e),m=I(I({},u),i);this._paramsForTencentCDN.set(e,m)}async startPublishTencentCDN(e){if(this._log.info(`[CDNStreaming] startPublishTencentCDN ${JSON.stringify(e)}`),this.installEvents(),this.changeDataStatus(e.publishMode,{target:e,isStarted:!0}),!this.isStreamPublished(e.publishMode))return;let i=e.streamId||"",u=this.generatePublishCDNStreamId(i,e.publishMode),m=this.generatePublishCDNSessionId(e.publishMode),h=e.publishMode==="publish-sub-stream-to-cdn"?1:0,l={requestTime:Date.now(),sessionId:m,streamId:u,streamType:h};await this.doStartPublishTencentCDN(l,e.publishMode);let{appId:p,bizId:b,url:_}=e;if(p&&b&&_){let D=this._paramsForTencentCDN.get(e.publishMode)||this._initParamsForTencentCDN;D!=null&&D.givenCDNManager||(D.givenCDNManager=new M(this._core,this._log),this._paramsForTencentCDN.set(e.publishMode,D)),await D.givenCDNManager.startPublishGivenCDN({publishMode:e.publishMode,appId:p,bizId:b,url:_,streamId:u})}}async doStartPublishTencentCDN(e,i){this._log.info(`[CDNStreaming] doStartPublishTencentCDN: ${JSON.stringify(e)}`);let u=6,m=500,h=0;for(;;){let l=await this._room.sendStartPublishCDN(e,!0),{code:p}=l.data,{message:b}=l.data;if(p===0){this._log.info("[CDNStreaming] server success: start tencent cdn"),this.changeDataStatus(i,{isPublished:!0});break}else if(p===-10006&&h<u)this._log.warn(`[CDNStreaming] doStartPublishTencentCDN: retry...${h+1}/6, reason: ${b}`),h+=1,await new Promise(_=>setTimeout(_,m));else throw this.changeDataStatus(i,{isPublished:!1}),p===-102083&&(b=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this._log.error(`[CDNStreaming] server failed: start tencent cdn errCode: ${p} errMsg: ${b}`),new Error(`[CDNStreaming] server failed: start tencent cdn errCode: ${p} errMsg: ${b}`)}}async stopPublishTencentCDN(e){this._log.info(`[CDNStreaming] doStartPublishTencentCDN: ${JSON.stringify(e)}`);let i=this._paramsForTencentCDN.get(e)||this._initParamsForTencentCDN;if(i.isPublished){let{target:u}=i;u!=null&&u.bizId&&u.appId&&u.url&&(i!=null&&i.givenCDNManager)&&await(i==null?void 0:i.givenCDNManager.stopPublishGivenCDN()),await this.doStopPublishTencentCDN(e)}this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}async doStopPublishTencentCDN(e){let i={requestTime:Date.now(),sessionId:(0,H.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)};this._log.info(`[CDNStreaming] doStopPublishTencentCDN: ${JSON.stringify(i)}`);let u=await this._room.sendStopPublishCDN(i,!0),{code:m}=u.data,{message:h}=u.data;if(m===0)this._log.info("[CDNStreaming] server success: stop tencent cdn"),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),this.reset(e);else throw m===-102069&&(this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),h=`can not stop in auto relayed-push mode ${h}`),this._log.error(`[CDNStreaming] server failed: stop tencent cdn errCode: ${m} errMsg: ${h}`),new Error(`[CDNStreaming] server failed: stop tencent cdn errCode: ${m} errMsg: ${h}`)}reset(e){this.uninstallEvents(),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}generatePublishCDNStreamId(e,i){if(e===""){let u=`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(i)}`;return/^[A-Za-z\d_-]*$/.test(u)||(u=(0,H.default)(u)),`${this._room.sdkAppId}_${u}`}return e}convertPublishModeToStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}generatePublishCDNSessionId(e){return(0,H.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)}};var ee=d=>typeof d=="string";function P(d){throw new Error(`[CDNStreaming] options error: ${d}`)}function De(d,e,i,u){/^[A-Za-z\d_-]*$/.test(d)||P("Invalid parameter streamId.")}function _e(d,e,i,u){if(ee(d))P("roomId must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.");else{if(d===void 0)return;/^[1-9]\d*$/.test(String(d))&&d<4294967295||P("roomId must be an integer between [1, 4294967294].")}}function fe(d,e,i,u){/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(d)||P("strRoomId must be a valid string.")}var N={type:"number",notLessThanZero:!0},te={type:"object",required:!0,properties:{userId:{required:!0,type:"string"},roomId:{type:["string","number"],validate:_e},strRoomId:{type:"string",validate:fe}}},re={required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]},streamId:{required:!1,type:"string",validate:De},appId:{type:"number",allowEmpty:!1},bizId:{type:"number",allowEmpty:!1},url:{type:"string",allowEmpty:!1}}},ie={required:!1,type:"object",properties:{videoWidth:N,videoHeight:N,videoBitrate:z(I({},N),{allowEmpty:!1}),videoFramerate:{type:"number",validate(d,e,i,u){(d<=0||d>30)&&P("Invalid parameter mixConfig -> videoFramerate, the value must be between (0, 30].")}},videoGOP:{type:"number",validate(d,e,i,u){(d<1||d>8)&&P("Invalid parameter mixConfig -> videoGOP, the value must be between [1, 8].")}},audioSampleRate:N,audioBitrate:{type:"number",validate(d,e,i,u){(d<32||d>192)&&P("Invalid parameter mixConfig -> audioBitrate, the value must be between [32, 192].")}},audioChannels:{type:"number",values:[1,2]}}},oe={required:!1,type:"object",properties:{backgroundColor:{type:"number"},backgroundImage:{type:"string"},audioMixUserList:{type:"array",arrayItem:I({},te)},videoLayoutList:{type:"array",required:!0,arrayItem:{type:"object",properties:{fixedVideoUser:I({},te),fixedVideoStreamType:{type:"string",required:!0,values:["main","sub"]},fillMode:{type:"number",values:[0,1,2,4]},zOrder:{type:"number",required:!0,validate(d,e,i,u){(d<1||d>15)&&P("Invalid parameter mix -> videoLayoutList -> zOrder, the value must be between [1, 15].")}},width:N,height:N,locationX:N,locationY:N}}}}};function ae(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},re),encoding:I({},ie),mix:I({},oe)},validate(e,i,u,m){var b,_;let{publishMode:h}=e.target,{encoding:l,mix:p}=e;if(h==="publish-mix-stream-to-cdn"&&((!l||!p)&&P("Invalid parameter mix & encoding, the value must be not empty."),p&&p.videoLayoutList)){let D=0,R=0,w=[];p.videoLayoutList.forEach((O,q)=>{w.push(O.fixedVideoUser.userId),O.width+O.locationX>D&&(D=O.width+O.locationX),O.height+O.locationY>R&&(R=O.height+O.locationY)}),w.indexOf(d.room.userId)<0&&P("Invalid parameter mix -> videoLayoutList, the value must be include self.");let k=(b=l==null?void 0:l.videoWidth)!=null?b:640,y=(_=l==null?void 0:l.videoHeight)!=null?_:480;(k<D||y<R)&&P("Invalid parameter encoding, the width and height of the mixed video must encompass all the mixed-in video streams.")}}}}function se(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},re),encoding:I({},ie),mix:I({},oe)}}}function ne(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:{required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]}}}}}}var x=0,v=class{constructor(e){this.core=e;S(this,"_mixTranscodeManager");S(this,"_publishCDNManager");S(this,"_core");S(this,"_modeOptions");S(this,"seq");S(this,"_log");x=x+1,this.seq=x,this._log=e.log.createChild({id:`${this.getAlias()}${x}`}),this._log.info(`[CDNStreaming] created id=${this.getAlias()}${x}`),this._core=e,this._modeOptions=new Map,this._mixTranscodeManager=new E(e,this._log),this._publishCDNManager=new L(e,this._log)}getName(){return"CDNStreaming"}getAlias(){return"cdn"}getValidateRule(e){switch(e){case"start":return ae(this._core);case"update":return se(this._core);case"stop":return ne(this._core)}}getGroup(e){return e.target.publishMode}async start(e){return this._modeOptions.set(e.target.publishMode,e),await this.doStart(e)}async update(e){let i=this._modeOptions.get(e.target.publishMode);return this._core.utils.deepMerge(i,e),await this.doStart(i)}async stop(e){switch(e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.stopMixTranscode();break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.stopPublishTencentCDN(e.target.publishMode);break}}this._modeOptions.delete(e.target.publishMode)}async doStart(e){switch(this._log.info(`[CDNStreaming] doStart: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.startMixTranscode(e);break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.startPublishTencentCDN(e.target);break}}}};S(v,"TYPE",{PublishMode:{PublishMainStreamToCDN:"publish-main-stream-to-cdn",PublishSubStreamToCDN:"publish-sub-stream-to-cdn",PublishMixStreamToCDN:"publish-mix-stream-to-cdn"}});var Ie=v;return Ce(Oe);})().default;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rtc-plugin/virtual-background",
|
|
3
|
+
"version": "5.2.0",
|
|
4
|
+
"description": "TRTC Web SDK 5.x virtual background plugin",
|
|
5
|
+
"main": "./virtual-background.esm.js",
|
|
6
|
+
"author": "longyuqi <longyuqi@tencent.com>",
|
|
7
|
+
"module": "./virtual-background.esm.js",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git@github.com:LiteAVSDK/TRTC_Web.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/en/tutorial-36-advanced-virtual-background.html",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"webrtc",
|
|
15
|
+
"TRTC",
|
|
16
|
+
"rtc",
|
|
17
|
+
"call",
|
|
18
|
+
"video call",
|
|
19
|
+
"audio call",
|
|
20
|
+
"javascript",
|
|
21
|
+
"video",
|
|
22
|
+
"audio",
|
|
23
|
+
"camera",
|
|
24
|
+
"microphone",
|
|
25
|
+
"live streaming",
|
|
26
|
+
"real-time communication",
|
|
27
|
+
"blur background"
|
|
28
|
+
],
|
|
29
|
+
"types": "./virtual-background.esm.d.ts"
|
|
30
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface AuthParam {
|
|
2
|
+
sdkAppId: number;
|
|
3
|
+
userId: string;
|
|
4
|
+
userSig: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface VirtualBackgroundOptions {
|
|
8
|
+
sdkAppId: number;
|
|
9
|
+
userId: string;
|
|
10
|
+
userSig: string;
|
|
11
|
+
type?: 'image' | 'blur';
|
|
12
|
+
src?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
export interface UpdateVirtualBackgroundOptions {
|
|
17
|
+
type: 'image' | 'blur';
|
|
18
|
+
src?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export declare class VirtualBackground {
|
|
22
|
+
start(options: VirtualBackgroundOptions): Promise<void>;
|
|
23
|
+
update(options: UpdateVirtualBackgroundOptions): Promise<void>;
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default VirtualBackground;
|