agora-electron-sdk 4.5.2 → 4.5.3-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +6 -3
  3. package/js/example/src/renderer/examples/advanced/VideoEffect/videoEffectHelpers.js +395 -0
  4. package/js/{AgoraSdk.js → ts/AgoraSdk.js} +2 -12
  5. package/js/{Decoder → ts/Decoder}/index.js +1 -1
  6. package/js/{Private → ts/Private}/AgoraBase.js +829 -674
  7. package/js/{Private → ts/Private}/AgoraMediaBase.js +154 -151
  8. package/js/{Private → ts/Private}/AgoraMediaPlayerTypes.js +58 -54
  9. package/js/{Private → ts/Private}/IAgoraLog.js +13 -13
  10. package/js/{Private → ts/Private}/IAgoraMediaEngine.js +4 -4
  11. package/js/{Private → ts/Private}/IAgoraMediaPlayer.js +2 -2
  12. package/js/{Private → ts/Private}/IAgoraMusicContentCenter.js +1 -1
  13. package/js/{Private → ts/Private}/IAgoraRhythmPlayer.js +13 -13
  14. package/js/{Private → ts/Private}/IAgoraRtcEngine.js +150 -94
  15. package/js/{Private → ts/Private}/IAgoraRtcEngineEx.js +3 -3
  16. package/js/{Private → ts/Private}/IAgoraSpatialAudio.js +4 -4
  17. package/js/{Private → ts/Private}/IAudioDeviceManager.js +2 -2
  18. package/js/{Private → ts/Private}/impl/IAgoraMediaPlayerImpl.js +10 -0
  19. package/js/{Private → ts/Private}/impl/IAgoraRtcEngineExImpl.js +74 -0
  20. package/js/{Private → ts/Private}/impl/IAgoraRtcEngineImpl.js +233 -1
  21. package/js/{Private → ts/Private}/internal/IrisApiEngine.js +45 -0
  22. package/js/{Private → ts/Private}/internal/RtcEngineExInternal.js +74 -4
  23. package/js/ts/Private/internal/VideoEffectObjectInternal.js +14 -0
  24. package/js/{Private → ts/Private}/ti/IAgoraRtcEngine-ti.js +2 -0
  25. package/js/{Renderer → ts/Renderer}/AgoraView.js +19 -2
  26. package/js/{Renderer → ts/Renderer}/IRenderer.js +7 -4
  27. package/js/{Renderer → ts/Renderer}/IRendererCache.js +17 -1
  28. package/js/ts/Renderer/RendererCache.js +252 -0
  29. package/js/{Renderer → ts/Renderer}/RendererManager.js +13 -64
  30. package/js/{Renderer → ts/Renderer}/WebCodecsRenderer/index.js +5 -5
  31. package/js/{Renderer → ts/Renderer}/WebCodecsRendererCache.js +13 -1
  32. package/js/{Renderer → ts/Renderer}/WebGLRenderer/index.js +179 -26
  33. package/js/{Renderer → ts/Renderer}/YUVCanvasRenderer/index.js +12 -5
  34. package/js/{Utils.js → ts/Utils.js} +7 -7
  35. package/package.json +25 -12
  36. package/scripts/checkElectron.js +4 -2
  37. package/scripts/download.js +102 -0
  38. package/scripts/downloadPrebuild.js +2 -1
  39. package/scripts/synclib.js +2 -2
  40. package/ts/AgoraSdk.ts +2 -12
  41. package/ts/Decoder/index.ts +5 -1
  42. package/ts/Private/AgoraBase.ts +1259 -1060
  43. package/ts/Private/AgoraMediaBase.ts +351 -324
  44. package/ts/Private/AgoraMediaPlayerTypes.ts +94 -91
  45. package/ts/Private/IAgoraLog.ts +20 -18
  46. package/ts/Private/IAgoraMediaEngine.ts +86 -81
  47. package/ts/Private/IAgoraMediaPlayer.ts +196 -181
  48. package/ts/Private/IAgoraMediaPlayerSource.ts +40 -40
  49. package/ts/Private/IAgoraMusicContentCenter.ts +3 -3
  50. package/ts/Private/IAgoraRhythmPlayer.ts +15 -15
  51. package/ts/Private/IAgoraRtcEngine.ts +2492 -2047
  52. package/ts/Private/IAgoraRtcEngineEx.ts +434 -335
  53. package/ts/Private/IAgoraSpatialAudio.ts +43 -45
  54. package/ts/Private/IAudioDeviceManager.ts +106 -97
  55. package/ts/Private/impl/IAgoraMediaPlayerImpl.ts +12 -0
  56. package/ts/Private/impl/IAgoraRtcEngineExImpl.ts +138 -0
  57. package/ts/Private/impl/IAgoraRtcEngineImpl.ts +331 -0
  58. package/ts/Private/internal/IrisApiEngine.ts +47 -0
  59. package/ts/Private/internal/RtcEngineExInternal.ts +106 -9
  60. package/ts/Private/internal/VideoEffectObjectInternal.ts +14 -0
  61. package/ts/Private/ti/IAgoraRtcEngine-ti.ts +2 -0
  62. package/ts/Renderer/AgoraView.ts +32 -3
  63. package/ts/Renderer/IRenderer.ts +8 -3
  64. package/ts/Renderer/IRendererCache.ts +33 -0
  65. package/ts/Renderer/RendererCache.ts +211 -12
  66. package/ts/Renderer/RendererManager.ts +21 -99
  67. package/ts/Renderer/WebCodecsRenderer/index.ts +9 -6
  68. package/ts/Renderer/WebCodecsRendererCache.ts +17 -1
  69. package/ts/Renderer/WebGLRenderer/index.ts +246 -40
  70. package/ts/Renderer/YUVCanvasRenderer/index.ts +29 -16
  71. package/ts/Types.ts +14 -9
  72. package/ts/Utils.ts +8 -7
  73. package/types/example/src/renderer/examples/advanced/VideoEffect/videoEffectHelpers.d.ts +168 -0
  74. package/types/example/src/renderer/examples/advanced/VideoEffect/videoEffectHelpers.d.ts.map +1 -0
  75. package/types/{AgoraSdk.d.ts → ts/AgoraSdk.d.ts} +2 -12
  76. package/types/ts/AgoraSdk.d.ts.map +1 -0
  77. package/types/ts/Decoder/gpu-utils.d.ts.map +1 -0
  78. package/types/ts/Decoder/index.d.ts.map +1 -0
  79. package/types/ts/Private/AgoraBase.d.ts +5504 -0
  80. package/types/ts/Private/AgoraBase.d.ts.map +1 -0
  81. package/types/ts/Private/AgoraMediaBase.d.ts +1695 -0
  82. package/types/ts/Private/AgoraMediaBase.d.ts.map +1 -0
  83. package/types/ts/Private/AgoraMediaPlayerTypes.d.ts +456 -0
  84. package/types/ts/Private/AgoraMediaPlayerTypes.d.ts.map +1 -0
  85. package/types/ts/Private/IAgoraH265Transcoder.d.ts.map +1 -0
  86. package/types/ts/Private/IAgoraLog.d.ts +91 -0
  87. package/types/ts/Private/IAgoraLog.d.ts.map +1 -0
  88. package/types/ts/Private/IAgoraMediaEngine.d.ts +255 -0
  89. package/types/ts/Private/IAgoraMediaEngine.d.ts.map +1 -0
  90. package/types/ts/Private/IAgoraMediaPlayer.d.ts +662 -0
  91. package/types/ts/Private/IAgoraMediaPlayer.d.ts.map +1 -0
  92. package/types/ts/Private/IAgoraMediaPlayerSource.d.ts +109 -0
  93. package/types/ts/Private/IAgoraMediaPlayerSource.d.ts.map +1 -0
  94. package/types/ts/Private/IAgoraMediaRecorder.d.ts.map +1 -0
  95. package/types/ts/Private/IAgoraMediaStreamingSource.d.ts.map +1 -0
  96. package/types/{Private → ts/Private}/IAgoraMusicContentCenter.d.ts +3 -3
  97. package/types/ts/Private/IAgoraMusicContentCenter.d.ts.map +1 -0
  98. package/types/ts/Private/IAgoraRhythmPlayer.d.ts +65 -0
  99. package/types/ts/Private/IAgoraRhythmPlayer.d.ts.map +1 -0
  100. package/types/ts/Private/IAgoraRtcEngine.d.ts +6504 -0
  101. package/types/ts/Private/IAgoraRtcEngine.d.ts.map +1 -0
  102. package/types/ts/Private/IAgoraRtcEngineEx.d.ts +817 -0
  103. package/types/ts/Private/IAgoraRtcEngineEx.d.ts.map +1 -0
  104. package/types/ts/Private/IAgoraSpatialAudio.d.ts +194 -0
  105. package/types/ts/Private/IAgoraSpatialAudio.d.ts.map +1 -0
  106. package/types/ts/Private/IAudioDeviceManager.d.ts +321 -0
  107. package/types/ts/Private/IAudioDeviceManager.d.ts.map +1 -0
  108. package/types/ts/Private/extension/AgoraBaseExtension.d.ts.map +1 -0
  109. package/types/ts/Private/extension/AgoraMediaBaseExtension.d.ts.map +1 -0
  110. package/types/ts/Private/extension/AgoraMediaPlayerTypesExtension.d.ts.map +1 -0
  111. package/types/ts/Private/extension/IAgoraH265TranscoderExtension.d.ts.map +1 -0
  112. package/types/ts/Private/extension/IAgoraLogExtension.d.ts.map +1 -0
  113. package/types/ts/Private/extension/IAgoraMediaEngineExtension.d.ts.map +1 -0
  114. package/types/ts/Private/extension/IAgoraMediaPlayerExtension.d.ts.map +1 -0
  115. package/types/ts/Private/extension/IAgoraMediaPlayerSourceExtension.d.ts.map +1 -0
  116. package/types/ts/Private/extension/IAgoraMediaRecorderExtension.d.ts.map +1 -0
  117. package/types/ts/Private/extension/IAgoraMusicContentCenterExtension.d.ts.map +1 -0
  118. package/types/ts/Private/extension/IAgoraRhythmPlayerExtension.d.ts.map +1 -0
  119. package/types/ts/Private/extension/IAgoraRtcEngineExExtension.d.ts.map +1 -0
  120. package/types/ts/Private/extension/IAgoraRtcEngineExtension.d.ts.map +1 -0
  121. package/types/ts/Private/extension/IAgoraSpatialAudioExtension.d.ts.map +1 -0
  122. package/types/ts/Private/extension/IAudioDeviceManagerExtension.d.ts.map +1 -0
  123. package/types/ts/Private/impl/AgoraBaseImpl.d.ts.map +1 -0
  124. package/types/ts/Private/impl/AgoraMediaBaseImpl.d.ts.map +1 -0
  125. package/types/ts/Private/impl/IAgoraH265TranscoderImpl.d.ts.map +1 -0
  126. package/types/ts/Private/impl/IAgoraMediaEngineImpl.d.ts.map +1 -0
  127. package/types/{Private → ts/Private}/impl/IAgoraMediaPlayerImpl.d.ts +2 -0
  128. package/types/ts/Private/impl/IAgoraMediaPlayerImpl.d.ts.map +1 -0
  129. package/types/ts/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts.map +1 -0
  130. package/types/ts/Private/impl/IAgoraMediaRecorderImpl.d.ts.map +1 -0
  131. package/types/ts/Private/impl/IAgoraMusicContentCenterImpl.d.ts.map +1 -0
  132. package/types/{Private → ts/Private}/impl/IAgoraRtcEngineExImpl.d.ts +7 -1
  133. package/types/ts/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +1 -0
  134. package/types/{Private → ts/Private}/impl/IAgoraRtcEngineImpl.d.ts +27 -1
  135. package/types/ts/Private/impl/IAgoraRtcEngineImpl.d.ts.map +1 -0
  136. package/types/ts/Private/impl/IAgoraSpatialAudioImpl.d.ts.map +1 -0
  137. package/types/ts/Private/impl/IAudioDeviceManagerImpl.d.ts.map +1 -0
  138. package/types/ts/Private/internal/AgoraH265TranscoderInternal.d.ts.map +1 -0
  139. package/types/ts/Private/internal/AgoraMediaBaseInternal.d.ts.map +1 -0
  140. package/types/ts/Private/internal/AudioDeviceManagerInternal.d.ts.map +1 -0
  141. package/types/ts/Private/internal/IrisApiEngine.d.ts.map +1 -0
  142. package/types/ts/Private/internal/LocalSpatialAudioEngineInternal.d.ts.map +1 -0
  143. package/types/ts/Private/internal/MediaEngineInternal.d.ts.map +1 -0
  144. package/types/ts/Private/internal/MediaPlayerInternal.d.ts.map +1 -0
  145. package/types/ts/Private/internal/MediaRecorderInternal.d.ts.map +1 -0
  146. package/types/ts/Private/internal/MusicContentCenterInternal.d.ts.map +1 -0
  147. package/types/{Private → ts/Private}/internal/RtcEngineExInternal.d.ts +10 -4
  148. package/types/ts/Private/internal/RtcEngineExInternal.d.ts.map +1 -0
  149. package/types/ts/Private/internal/VideoEffectObjectInternal.d.ts +7 -0
  150. package/types/ts/Private/internal/VideoEffectObjectInternal.d.ts.map +1 -0
  151. package/types/{Private → ts/Private}/ipc/main.d.ts.map +1 -1
  152. package/types/ts/Private/ipc/renderer.d.ts.map +1 -0
  153. package/types/ts/Private/ti/AgoraBase-ti.d.ts.map +1 -0
  154. package/types/ts/Private/ti/AgoraMediaBase-ti.d.ts.map +1 -0
  155. package/types/ts/Private/ti/AgoraMediaPlayerTypes-ti.d.ts.map +1 -0
  156. package/types/ts/Private/ti/IAgoraH265Transcoder-ti.d.ts.map +1 -0
  157. package/types/ts/Private/ti/IAgoraLog-ti.d.ts.map +1 -0
  158. package/types/ts/Private/ti/IAgoraMediaEngine-ti.d.ts.map +1 -0
  159. package/types/ts/Private/ti/IAgoraMediaPlayer-ti.d.ts.map +1 -0
  160. package/types/ts/Private/ti/IAgoraMediaPlayerSource-ti.d.ts.map +1 -0
  161. package/types/ts/Private/ti/IAgoraMediaRecorder-ti.d.ts.map +1 -0
  162. package/types/ts/Private/ti/IAgoraMediaStreamingSource-ti.d.ts.map +1 -0
  163. package/types/ts/Private/ti/IAgoraMusicContentCenter-ti.d.ts.map +1 -0
  164. package/types/ts/Private/ti/IAgoraRhythmPlayer-ti.d.ts.map +1 -0
  165. package/types/ts/Private/ti/IAgoraRtcEngine-ti.d.ts.map +1 -0
  166. package/types/ts/Private/ti/IAgoraRtcEngineEx-ti.d.ts.map +1 -0
  167. package/types/ts/Private/ti/IAgoraSpatialAudio-ti.d.ts.map +1 -0
  168. package/types/ts/Private/ti/IAudioDeviceManager-ti.d.ts.map +1 -0
  169. package/types/{Renderer → ts/Renderer}/AgoraView.d.ts +6 -0
  170. package/types/ts/Renderer/AgoraView.d.ts.map +1 -0
  171. package/types/ts/Renderer/CapabilityManager.d.ts.map +1 -0
  172. package/types/{Renderer → ts/Renderer}/IRenderer.d.ts +2 -2
  173. package/types/ts/Renderer/IRenderer.d.ts.map +1 -0
  174. package/types/{Renderer → ts/Renderer}/IRendererCache.d.ts +21 -1
  175. package/types/ts/Renderer/IRendererCache.d.ts.map +1 -0
  176. package/types/{Renderer → ts/Renderer}/RendererCache.d.ts +27 -0
  177. package/types/ts/Renderer/RendererCache.d.ts.map +1 -0
  178. package/types/{Renderer → ts/Renderer}/RendererManager.d.ts +4 -17
  179. package/types/ts/Renderer/RendererManager.d.ts.map +1 -0
  180. package/types/{Renderer → ts/Renderer}/WebCodecsRenderer/index.d.ts +3 -3
  181. package/types/ts/Renderer/WebCodecsRenderer/index.d.ts.map +1 -0
  182. package/types/{Renderer → ts/Renderer}/WebCodecsRendererCache.d.ts +7 -0
  183. package/types/ts/Renderer/WebCodecsRendererCache.d.ts.map +1 -0
  184. package/types/{Renderer → ts/Renderer}/WebGLRenderer/index.d.ts +12 -2
  185. package/types/ts/Renderer/WebGLRenderer/index.d.ts.map +1 -0
  186. package/types/ts/Renderer/WebGLRenderer/webgl-utils.d.ts.map +1 -0
  187. package/types/ts/Renderer/YUVCanvasRenderer/index.d.ts +10 -0
  188. package/types/ts/Renderer/YUVCanvasRenderer/index.d.ts.map +1 -0
  189. package/types/ts/Renderer/index.d.ts.map +1 -0
  190. package/types/{Types.d.ts → ts/Types.d.ts} +11 -6
  191. package/types/ts/Types.d.ts.map +1 -0
  192. package/types/{Utils.d.ts → ts/Utils.d.ts} +1 -1
  193. package/types/ts/Utils.d.ts.map +1 -0
  194. package/js/Renderer/RendererCache.js +0 -100
  195. package/types/AgoraSdk.d.ts.map +0 -1
  196. package/types/Decoder/gpu-utils.d.ts.map +0 -1
  197. package/types/Decoder/index.d.ts.map +0 -1
  198. package/types/Private/AgoraBase.d.ts +0 -5310
  199. package/types/Private/AgoraBase.d.ts.map +0 -1
  200. package/types/Private/AgoraMediaBase.d.ts +0 -1668
  201. package/types/Private/AgoraMediaBase.d.ts.map +0 -1
  202. package/types/Private/AgoraMediaPlayerTypes.d.ts +0 -453
  203. package/types/Private/AgoraMediaPlayerTypes.d.ts.map +0 -1
  204. package/types/Private/IAgoraH265Transcoder.d.ts.map +0 -1
  205. package/types/Private/IAgoraLog.d.ts +0 -89
  206. package/types/Private/IAgoraLog.d.ts.map +0 -1
  207. package/types/Private/IAgoraMediaEngine.d.ts +0 -250
  208. package/types/Private/IAgoraMediaEngine.d.ts.map +0 -1
  209. package/types/Private/IAgoraMediaPlayer.d.ts +0 -648
  210. package/types/Private/IAgoraMediaPlayer.d.ts.map +0 -1
  211. package/types/Private/IAgoraMediaPlayerSource.d.ts +0 -109
  212. package/types/Private/IAgoraMediaPlayerSource.d.ts.map +0 -1
  213. package/types/Private/IAgoraMediaRecorder.d.ts.map +0 -1
  214. package/types/Private/IAgoraMediaStreamingSource.d.ts.map +0 -1
  215. package/types/Private/IAgoraMusicContentCenter.d.ts.map +0 -1
  216. package/types/Private/IAgoraRhythmPlayer.d.ts +0 -65
  217. package/types/Private/IAgoraRhythmPlayer.d.ts.map +0 -1
  218. package/types/Private/IAgoraRtcEngine.d.ts +0 -6103
  219. package/types/Private/IAgoraRtcEngine.d.ts.map +0 -1
  220. package/types/Private/IAgoraRtcEngineEx.d.ts +0 -741
  221. package/types/Private/IAgoraRtcEngineEx.d.ts.map +0 -1
  222. package/types/Private/IAgoraSpatialAudio.d.ts +0 -196
  223. package/types/Private/IAgoraSpatialAudio.d.ts.map +0 -1
  224. package/types/Private/IAudioDeviceManager.d.ts +0 -312
  225. package/types/Private/IAudioDeviceManager.d.ts.map +0 -1
  226. package/types/Private/extension/AgoraBaseExtension.d.ts.map +0 -1
  227. package/types/Private/extension/AgoraMediaBaseExtension.d.ts.map +0 -1
  228. package/types/Private/extension/AgoraMediaPlayerTypesExtension.d.ts.map +0 -1
  229. package/types/Private/extension/IAgoraH265TranscoderExtension.d.ts.map +0 -1
  230. package/types/Private/extension/IAgoraLogExtension.d.ts.map +0 -1
  231. package/types/Private/extension/IAgoraMediaEngineExtension.d.ts.map +0 -1
  232. package/types/Private/extension/IAgoraMediaPlayerExtension.d.ts.map +0 -1
  233. package/types/Private/extension/IAgoraMediaPlayerSourceExtension.d.ts.map +0 -1
  234. package/types/Private/extension/IAgoraMediaRecorderExtension.d.ts.map +0 -1
  235. package/types/Private/extension/IAgoraMusicContentCenterExtension.d.ts.map +0 -1
  236. package/types/Private/extension/IAgoraRhythmPlayerExtension.d.ts.map +0 -1
  237. package/types/Private/extension/IAgoraRtcEngineExExtension.d.ts.map +0 -1
  238. package/types/Private/extension/IAgoraRtcEngineExtension.d.ts.map +0 -1
  239. package/types/Private/extension/IAgoraSpatialAudioExtension.d.ts.map +0 -1
  240. package/types/Private/extension/IAudioDeviceManagerExtension.d.ts.map +0 -1
  241. package/types/Private/impl/AgoraBaseImpl.d.ts.map +0 -1
  242. package/types/Private/impl/AgoraMediaBaseImpl.d.ts.map +0 -1
  243. package/types/Private/impl/IAgoraH265TranscoderImpl.d.ts.map +0 -1
  244. package/types/Private/impl/IAgoraMediaEngineImpl.d.ts.map +0 -1
  245. package/types/Private/impl/IAgoraMediaPlayerImpl.d.ts.map +0 -1
  246. package/types/Private/impl/IAgoraMediaPlayerSourceImpl.d.ts.map +0 -1
  247. package/types/Private/impl/IAgoraMediaRecorderImpl.d.ts.map +0 -1
  248. package/types/Private/impl/IAgoraMusicContentCenterImpl.d.ts.map +0 -1
  249. package/types/Private/impl/IAgoraRtcEngineExImpl.d.ts.map +0 -1
  250. package/types/Private/impl/IAgoraRtcEngineImpl.d.ts.map +0 -1
  251. package/types/Private/impl/IAgoraSpatialAudioImpl.d.ts.map +0 -1
  252. package/types/Private/impl/IAudioDeviceManagerImpl.d.ts.map +0 -1
  253. package/types/Private/internal/AgoraH265TranscoderInternal.d.ts.map +0 -1
  254. package/types/Private/internal/AgoraMediaBaseInternal.d.ts.map +0 -1
  255. package/types/Private/internal/AudioDeviceManagerInternal.d.ts.map +0 -1
  256. package/types/Private/internal/IrisApiEngine.d.ts.map +0 -1
  257. package/types/Private/internal/LocalSpatialAudioEngineInternal.d.ts.map +0 -1
  258. package/types/Private/internal/MediaEngineInternal.d.ts.map +0 -1
  259. package/types/Private/internal/MediaPlayerInternal.d.ts.map +0 -1
  260. package/types/Private/internal/MediaRecorderInternal.d.ts.map +0 -1
  261. package/types/Private/internal/MusicContentCenterInternal.d.ts.map +0 -1
  262. package/types/Private/internal/RtcEngineExInternal.d.ts.map +0 -1
  263. package/types/Private/ipc/renderer.d.ts.map +0 -1
  264. package/types/Private/ti/AgoraBase-ti.d.ts.map +0 -1
  265. package/types/Private/ti/AgoraMediaBase-ti.d.ts.map +0 -1
  266. package/types/Private/ti/AgoraMediaPlayerTypes-ti.d.ts.map +0 -1
  267. package/types/Private/ti/IAgoraH265Transcoder-ti.d.ts.map +0 -1
  268. package/types/Private/ti/IAgoraLog-ti.d.ts.map +0 -1
  269. package/types/Private/ti/IAgoraMediaEngine-ti.d.ts.map +0 -1
  270. package/types/Private/ti/IAgoraMediaPlayer-ti.d.ts.map +0 -1
  271. package/types/Private/ti/IAgoraMediaPlayerSource-ti.d.ts.map +0 -1
  272. package/types/Private/ti/IAgoraMediaRecorder-ti.d.ts.map +0 -1
  273. package/types/Private/ti/IAgoraMediaStreamingSource-ti.d.ts.map +0 -1
  274. package/types/Private/ti/IAgoraMusicContentCenter-ti.d.ts.map +0 -1
  275. package/types/Private/ti/IAgoraRhythmPlayer-ti.d.ts.map +0 -1
  276. package/types/Private/ti/IAgoraRtcEngine-ti.d.ts.map +0 -1
  277. package/types/Private/ti/IAgoraRtcEngineEx-ti.d.ts.map +0 -1
  278. package/types/Private/ti/IAgoraSpatialAudio-ti.d.ts.map +0 -1
  279. package/types/Private/ti/IAudioDeviceManager-ti.d.ts.map +0 -1
  280. package/types/Renderer/AgoraView.d.ts.map +0 -1
  281. package/types/Renderer/CapabilityManager.d.ts.map +0 -1
  282. package/types/Renderer/IRenderer.d.ts.map +0 -1
  283. package/types/Renderer/IRendererCache.d.ts.map +0 -1
  284. package/types/Renderer/RendererCache.d.ts.map +0 -1
  285. package/types/Renderer/RendererManager.d.ts.map +0 -1
  286. package/types/Renderer/WebCodecsRenderer/index.d.ts.map +0 -1
  287. package/types/Renderer/WebCodecsRendererCache.d.ts.map +0 -1
  288. package/types/Renderer/WebGLRenderer/index.d.ts.map +0 -1
  289. package/types/Renderer/WebGLRenderer/webgl-utils.d.ts.map +0 -1
  290. package/types/Renderer/YUVCanvasRenderer/index.d.ts +0 -9
  291. package/types/Renderer/YUVCanvasRenderer/index.d.ts.map +0 -1
  292. package/types/Renderer/index.d.ts.map +0 -1
  293. package/types/Types.d.ts.map +0 -1
  294. package/types/Utils.d.ts.map +0 -1
  295. /package/js/{Decoder → ts/Decoder}/gpu-utils.js +0 -0
  296. /package/js/{Private → ts/Private}/IAgoraH265Transcoder.js +0 -0
  297. /package/js/{Private → ts/Private}/IAgoraMediaPlayerSource.js +0 -0
  298. /package/js/{Private → ts/Private}/IAgoraMediaRecorder.js +0 -0
  299. /package/js/{Private → ts/Private}/IAgoraMediaStreamingSource.js +0 -0
  300. /package/js/{Private → ts/Private}/extension/AgoraBaseExtension.js +0 -0
  301. /package/js/{Private → ts/Private}/extension/AgoraMediaBaseExtension.js +0 -0
  302. /package/js/{Private → ts/Private}/extension/AgoraMediaPlayerTypesExtension.js +0 -0
  303. /package/js/{Private → ts/Private}/extension/IAgoraH265TranscoderExtension.js +0 -0
  304. /package/js/{Private → ts/Private}/extension/IAgoraLogExtension.js +0 -0
  305. /package/js/{Private → ts/Private}/extension/IAgoraMediaEngineExtension.js +0 -0
  306. /package/js/{Private → ts/Private}/extension/IAgoraMediaPlayerExtension.js +0 -0
  307. /package/js/{Private → ts/Private}/extension/IAgoraMediaPlayerSourceExtension.js +0 -0
  308. /package/js/{Private → ts/Private}/extension/IAgoraMediaRecorderExtension.js +0 -0
  309. /package/js/{Private → ts/Private}/extension/IAgoraMusicContentCenterExtension.js +0 -0
  310. /package/js/{Private → ts/Private}/extension/IAgoraRhythmPlayerExtension.js +0 -0
  311. /package/js/{Private → ts/Private}/extension/IAgoraRtcEngineExExtension.js +0 -0
  312. /package/js/{Private → ts/Private}/extension/IAgoraRtcEngineExtension.js +0 -0
  313. /package/js/{Private → ts/Private}/extension/IAgoraSpatialAudioExtension.js +0 -0
  314. /package/js/{Private → ts/Private}/extension/IAudioDeviceManagerExtension.js +0 -0
  315. /package/js/{Private → ts/Private}/impl/AgoraBaseImpl.js +0 -0
  316. /package/js/{Private → ts/Private}/impl/AgoraMediaBaseImpl.js +0 -0
  317. /package/js/{Private → ts/Private}/impl/IAgoraH265TranscoderImpl.js +0 -0
  318. /package/js/{Private → ts/Private}/impl/IAgoraMediaEngineImpl.js +0 -0
  319. /package/js/{Private → ts/Private}/impl/IAgoraMediaPlayerSourceImpl.js +0 -0
  320. /package/js/{Private → ts/Private}/impl/IAgoraMediaRecorderImpl.js +0 -0
  321. /package/js/{Private → ts/Private}/impl/IAgoraMusicContentCenterImpl.js +0 -0
  322. /package/js/{Private → ts/Private}/impl/IAgoraSpatialAudioImpl.js +0 -0
  323. /package/js/{Private → ts/Private}/impl/IAudioDeviceManagerImpl.js +0 -0
  324. /package/js/{Private → ts/Private}/internal/AgoraH265TranscoderInternal.js +0 -0
  325. /package/js/{Private → ts/Private}/internal/AgoraMediaBaseInternal.js +0 -0
  326. /package/js/{Private → ts/Private}/internal/AudioDeviceManagerInternal.js +0 -0
  327. /package/js/{Private → ts/Private}/internal/LocalSpatialAudioEngineInternal.js +0 -0
  328. /package/js/{Private → ts/Private}/internal/MediaEngineInternal.js +0 -0
  329. /package/js/{Private → ts/Private}/internal/MediaPlayerInternal.js +0 -0
  330. /package/js/{Private → ts/Private}/internal/MediaRecorderInternal.js +0 -0
  331. /package/js/{Private → ts/Private}/internal/MusicContentCenterInternal.js +0 -0
  332. /package/js/{Private → ts/Private}/ipc/main.js +0 -0
  333. /package/js/{Private → ts/Private}/ipc/renderer.js +0 -0
  334. /package/js/{Private → ts/Private}/ti/AgoraBase-ti.js +0 -0
  335. /package/js/{Private → ts/Private}/ti/AgoraMediaBase-ti.js +0 -0
  336. /package/js/{Private → ts/Private}/ti/AgoraMediaPlayerTypes-ti.js +0 -0
  337. /package/js/{Private → ts/Private}/ti/IAgoraH265Transcoder-ti.js +0 -0
  338. /package/js/{Private → ts/Private}/ti/IAgoraLog-ti.js +0 -0
  339. /package/js/{Private → ts/Private}/ti/IAgoraMediaEngine-ti.js +0 -0
  340. /package/js/{Private → ts/Private}/ti/IAgoraMediaPlayer-ti.js +0 -0
  341. /package/js/{Private → ts/Private}/ti/IAgoraMediaPlayerSource-ti.js +0 -0
  342. /package/js/{Private → ts/Private}/ti/IAgoraMediaRecorder-ti.js +0 -0
  343. /package/js/{Private → ts/Private}/ti/IAgoraMediaStreamingSource-ti.js +0 -0
  344. /package/js/{Private → ts/Private}/ti/IAgoraMusicContentCenter-ti.js +0 -0
  345. /package/js/{Private → ts/Private}/ti/IAgoraRhythmPlayer-ti.js +0 -0
  346. /package/js/{Private → ts/Private}/ti/IAgoraRtcEngineEx-ti.js +0 -0
  347. /package/js/{Private → ts/Private}/ti/IAgoraSpatialAudio-ti.js +0 -0
  348. /package/js/{Private → ts/Private}/ti/IAudioDeviceManager-ti.js +0 -0
  349. /package/js/{Renderer → ts/Renderer}/CapabilityManager.js +0 -0
  350. /package/js/{Renderer → ts/Renderer}/WebGLRenderer/webgl-utils.js +0 -0
  351. /package/js/{Renderer → ts/Renderer}/index.js +0 -0
  352. /package/js/{Types.js → ts/Types.js} +0 -0
  353. /package/types/{Decoder → ts/Decoder}/gpu-utils.d.ts +0 -0
  354. /package/types/{Decoder → ts/Decoder}/index.d.ts +0 -0
  355. /package/types/{Private → ts/Private}/IAgoraH265Transcoder.d.ts +0 -0
  356. /package/types/{Private → ts/Private}/IAgoraMediaRecorder.d.ts +0 -0
  357. /package/types/{Private → ts/Private}/IAgoraMediaStreamingSource.d.ts +0 -0
  358. /package/types/{Private → ts/Private}/extension/AgoraBaseExtension.d.ts +0 -0
  359. /package/types/{Private → ts/Private}/extension/AgoraMediaBaseExtension.d.ts +0 -0
  360. /package/types/{Private → ts/Private}/extension/AgoraMediaPlayerTypesExtension.d.ts +0 -0
  361. /package/types/{Private → ts/Private}/extension/IAgoraH265TranscoderExtension.d.ts +0 -0
  362. /package/types/{Private → ts/Private}/extension/IAgoraLogExtension.d.ts +0 -0
  363. /package/types/{Private → ts/Private}/extension/IAgoraMediaEngineExtension.d.ts +0 -0
  364. /package/types/{Private → ts/Private}/extension/IAgoraMediaPlayerExtension.d.ts +0 -0
  365. /package/types/{Private → ts/Private}/extension/IAgoraMediaPlayerSourceExtension.d.ts +0 -0
  366. /package/types/{Private → ts/Private}/extension/IAgoraMediaRecorderExtension.d.ts +0 -0
  367. /package/types/{Private → ts/Private}/extension/IAgoraMusicContentCenterExtension.d.ts +0 -0
  368. /package/types/{Private → ts/Private}/extension/IAgoraRhythmPlayerExtension.d.ts +0 -0
  369. /package/types/{Private → ts/Private}/extension/IAgoraRtcEngineExExtension.d.ts +0 -0
  370. /package/types/{Private → ts/Private}/extension/IAgoraRtcEngineExtension.d.ts +0 -0
  371. /package/types/{Private → ts/Private}/extension/IAgoraSpatialAudioExtension.d.ts +0 -0
  372. /package/types/{Private → ts/Private}/extension/IAudioDeviceManagerExtension.d.ts +0 -0
  373. /package/types/{Private → ts/Private}/impl/AgoraBaseImpl.d.ts +0 -0
  374. /package/types/{Private → ts/Private}/impl/AgoraMediaBaseImpl.d.ts +0 -0
  375. /package/types/{Private → ts/Private}/impl/IAgoraH265TranscoderImpl.d.ts +0 -0
  376. /package/types/{Private → ts/Private}/impl/IAgoraMediaEngineImpl.d.ts +0 -0
  377. /package/types/{Private → ts/Private}/impl/IAgoraMediaPlayerSourceImpl.d.ts +0 -0
  378. /package/types/{Private → ts/Private}/impl/IAgoraMediaRecorderImpl.d.ts +0 -0
  379. /package/types/{Private → ts/Private}/impl/IAgoraMusicContentCenterImpl.d.ts +0 -0
  380. /package/types/{Private → ts/Private}/impl/IAgoraSpatialAudioImpl.d.ts +0 -0
  381. /package/types/{Private → ts/Private}/impl/IAudioDeviceManagerImpl.d.ts +0 -0
  382. /package/types/{Private → ts/Private}/internal/AgoraH265TranscoderInternal.d.ts +0 -0
  383. /package/types/{Private → ts/Private}/internal/AgoraMediaBaseInternal.d.ts +0 -0
  384. /package/types/{Private → ts/Private}/internal/AudioDeviceManagerInternal.d.ts +0 -0
  385. /package/types/{Private → ts/Private}/internal/IrisApiEngine.d.ts +0 -0
  386. /package/types/{Private → ts/Private}/internal/LocalSpatialAudioEngineInternal.d.ts +0 -0
  387. /package/types/{Private → ts/Private}/internal/MediaEngineInternal.d.ts +0 -0
  388. /package/types/{Private → ts/Private}/internal/MediaPlayerInternal.d.ts +0 -0
  389. /package/types/{Private → ts/Private}/internal/MediaRecorderInternal.d.ts +0 -0
  390. /package/types/{Private → ts/Private}/internal/MusicContentCenterInternal.d.ts +0 -0
  391. /package/types/{Private → ts/Private}/ipc/main.d.ts +0 -0
  392. /package/types/{Private → ts/Private}/ipc/renderer.d.ts +0 -0
  393. /package/types/{Private → ts/Private}/ti/AgoraBase-ti.d.ts +0 -0
  394. /package/types/{Private → ts/Private}/ti/AgoraMediaBase-ti.d.ts +0 -0
  395. /package/types/{Private → ts/Private}/ti/AgoraMediaPlayerTypes-ti.d.ts +0 -0
  396. /package/types/{Private → ts/Private}/ti/IAgoraH265Transcoder-ti.d.ts +0 -0
  397. /package/types/{Private → ts/Private}/ti/IAgoraLog-ti.d.ts +0 -0
  398. /package/types/{Private → ts/Private}/ti/IAgoraMediaEngine-ti.d.ts +0 -0
  399. /package/types/{Private → ts/Private}/ti/IAgoraMediaPlayer-ti.d.ts +0 -0
  400. /package/types/{Private → ts/Private}/ti/IAgoraMediaPlayerSource-ti.d.ts +0 -0
  401. /package/types/{Private → ts/Private}/ti/IAgoraMediaRecorder-ti.d.ts +0 -0
  402. /package/types/{Private → ts/Private}/ti/IAgoraMediaStreamingSource-ti.d.ts +0 -0
  403. /package/types/{Private → ts/Private}/ti/IAgoraMusicContentCenter-ti.d.ts +0 -0
  404. /package/types/{Private → ts/Private}/ti/IAgoraRhythmPlayer-ti.d.ts +0 -0
  405. /package/types/{Private → ts/Private}/ti/IAgoraRtcEngine-ti.d.ts +0 -0
  406. /package/types/{Private → ts/Private}/ti/IAgoraRtcEngineEx-ti.d.ts +0 -0
  407. /package/types/{Private → ts/Private}/ti/IAgoraSpatialAudio-ti.d.ts +0 -0
  408. /package/types/{Private → ts/Private}/ti/IAudioDeviceManager-ti.d.ts +0 -0
  409. /package/types/{Renderer → ts/Renderer}/CapabilityManager.d.ts +0 -0
  410. /package/types/{Renderer → ts/Renderer}/WebGLRenderer/webgl-utils.d.ts +0 -0
  411. /package/types/{Renderer → ts/Renderer}/index.d.ts +0 -0
@@ -12,6 +12,7 @@ const CHANNEL_ID_STRING = 'channel-id';
12
12
  const POSITION_STRING = 'position';
13
13
  const RENDERER_CONTENT_MODE_STRING = 'renderer-content-mode';
14
14
  const RENDERER_MIRROR_STRING = 'renderer-mirror';
15
+ const ENABLE_ALPHA_MASK_STRING = 'enable-alpha-mask';
15
16
 
16
17
  const observedAttributes = [
17
18
  VIDEO_SOURCE_TYPE_STRING,
@@ -20,6 +21,7 @@ const observedAttributes = [
20
21
  POSITION_STRING,
21
22
  RENDERER_CONTENT_MODE_STRING,
22
23
  RENDERER_MIRROR_STRING,
24
+ ENABLE_ALPHA_MASK_STRING,
23
25
  ];
24
26
 
25
27
  declare global {
@@ -61,6 +63,10 @@ declare global {
61
63
  * The inline style of elements. See style .
62
64
  */
63
65
  'style': any;
66
+ /**
67
+ * Whether to enable alpha mask rendering: true : Enable alpha mask rendering. false : (Default) Disable alpha mask rendering. Alpha mask rendering can create images with transparent effects and extract portraits from videos. When used in combination with other methods, you can implement effects such as portrait-in-picture and watermarking.
68
+ */
69
+ 'enable-alpha-mask': boolean;
64
70
  }
65
71
  namespace JSX {
66
72
  /**
@@ -163,13 +169,32 @@ export default class AgoraView extends HTMLElement {
163
169
  }
164
170
  }
165
171
 
172
+ get enableAlphaMask(): boolean {
173
+ return this.getAttribute(ENABLE_ALPHA_MASK_STRING) === 'true';
174
+ }
175
+
176
+ set enableAlphaMask(val) {
177
+ if (val) {
178
+ this.setAttribute(ENABLE_ALPHA_MASK_STRING, String(val));
179
+ } else {
180
+ this.removeAttribute(ENABLE_ALPHA_MASK_STRING);
181
+ }
182
+ }
183
+
166
184
  constructor() {
167
185
  super();
168
186
  }
169
187
 
170
188
  initializeRender = () => {
171
- const { channelId, uid, sourceType, position, renderMode, renderMirror } =
172
- this;
189
+ const {
190
+ channelId,
191
+ uid,
192
+ sourceType,
193
+ position,
194
+ renderMode,
195
+ renderMirror,
196
+ enableAlphaMask,
197
+ } = this;
173
198
  AgoraEnv.AgoraRendererManager?.addOrRemoveRenderer({
174
199
  sourceType,
175
200
  view: this,
@@ -181,17 +206,19 @@ export default class AgoraView extends HTMLElement {
181
206
  ? VideoMirrorModeType.VideoMirrorModeEnabled
182
207
  : VideoMirrorModeType.VideoMirrorModeDisabled,
183
208
  setupMode: VideoViewSetupMode.VideoViewSetupReplace,
209
+ enableAlphaMask,
184
210
  });
185
211
  };
186
212
 
187
213
  destroyRender = () => {
188
- const { channelId, uid, sourceType, position } = this;
214
+ const { channelId, uid, sourceType, position, enableAlphaMask } = this;
189
215
  AgoraEnv.AgoraRendererManager?.removeRendererFromCache({
190
216
  channelId,
191
217
  position,
192
218
  uid,
193
219
  sourceType,
194
220
  view: this,
221
+ enableAlphaMask,
195
222
  });
196
223
  };
197
224
 
@@ -207,6 +234,7 @@ export default class AgoraView extends HTMLElement {
207
234
  const isSetRenderOption = [
208
235
  RENDERER_CONTENT_MODE_STRING,
209
236
  RENDERER_MIRROR_STRING,
237
+ ENABLE_ALPHA_MASK_STRING,
210
238
  ].includes(attrName);
211
239
 
212
240
  if (isSetRenderOption) {
@@ -216,6 +244,7 @@ export default class AgoraView extends HTMLElement {
216
244
  mirrorMode: this.renderMirror
217
245
  ? VideoMirrorModeType.VideoMirrorModeEnabled
218
246
  : VideoMirrorModeType.VideoMirrorModeDisabled,
247
+ enableAlphaMask: this.enableAlphaMask,
219
248
  });
220
249
  return;
221
250
  }
@@ -11,8 +11,8 @@ export abstract class IRenderer {
11
11
  private _frameCount = 0;
12
12
  private _startTime: number | null = null;
13
13
 
14
- public bind(element: HTMLElement) {
15
- this.parentElement = element;
14
+ public bind(context: RendererContext) {
15
+ this.parentElement = context.view;
16
16
  this.container = document.createElement('div');
17
17
  Object.assign(this.container.style, {
18
18
  width: '100%',
@@ -22,7 +22,7 @@ export abstract class IRenderer {
22
22
  alignItems: 'center',
23
23
  overflow: 'hidden',
24
24
  });
25
- this.parentElement.appendChild(this.container);
25
+ this.parentElement?.appendChild(this.container);
26
26
  this.canvas = document.createElement('canvas');
27
27
  this.canvas.style.display = 'none';
28
28
  this.container.appendChild(this.canvas);
@@ -45,6 +45,7 @@ export abstract class IRenderer {
45
45
  }
46
46
 
47
47
  public drawFrame(
48
+ uid: number,
48
49
  _videoFrame?: VideoFrame,
49
50
  _codecConfig?: CodecConfigInfo
50
51
  ): void {
@@ -64,6 +65,10 @@ export abstract class IRenderer {
64
65
  this.context.mirrorMode = context.mirrorMode;
65
66
  this.updateMirrorMode();
66
67
  }
68
+
69
+ if (this.context.enableAlphaMask !== context.enableAlphaMask) {
70
+ this.context.enableAlphaMask = context.enableAlphaMask;
71
+ }
67
72
  this.context = { ...this.context, ...context };
68
73
  }
69
74
 
@@ -1,3 +1,5 @@
1
+ import { RtcConnection, VideoSourceType } from 'agora-electron-sdk';
2
+
1
3
  import { RendererCacheContext, RendererContext } from '../Types';
2
4
 
3
5
  import { IRenderer } from './IRenderer';
@@ -24,6 +26,16 @@ export function isUseConnection(context: RendererCacheContext): boolean {
24
26
  export abstract class IRendererCache {
25
27
  renderers: IRenderer[];
26
28
  cacheContext: RendererCacheContext;
29
+ callbackContext: { connection: RtcConnection; sourceType: VideoSourceType };
30
+
31
+ // 性能统计数据
32
+ public actualFps: number = 0;
33
+ public avgFrameTime: number = 0;
34
+ public maxFrameTime: number = 0;
35
+ public minFrameTime: number = 0;
36
+ public avgFrameInterval: number = 0;
37
+ public maxFrameInterval: number = 0;
38
+ public minFrameInterval: number = 0;
27
39
 
28
40
  constructor({
29
41
  channelId,
@@ -33,6 +45,7 @@ export abstract class IRendererCache {
33
45
  sourceType,
34
46
  localUid,
35
47
  position,
48
+ enableAlphaMask,
36
49
  }: RendererContext) {
37
50
  this.renderers = [];
38
51
  this.cacheContext = {
@@ -43,9 +56,21 @@ export abstract class IRendererCache {
43
56
  sourceType,
44
57
  localUid,
45
58
  position,
59
+ enableAlphaMask,
60
+ };
61
+ this.callbackContext = {
62
+ connection: { channelId, localUid },
63
+ sourceType: sourceType!,
46
64
  };
47
65
  }
48
66
 
67
+ public setCallbackContext(
68
+ connection: RtcConnection,
69
+ sourceType: VideoSourceType
70
+ ): void {
71
+ this.callbackContext = { connection, sourceType };
72
+ }
73
+
49
74
  public get key(): string {
50
75
  return generateRendererCacheKey(this.cacheContext);
51
76
  }
@@ -90,6 +115,14 @@ export abstract class IRendererCache {
90
115
  }
91
116
  }
92
117
 
118
+ public abstract fetchVideoFrame(): {
119
+ hasMoreFrame: boolean;
120
+ needRender: boolean;
121
+ };
122
+ public abstract renderFrame(): void;
123
+ public abstract startRendering(): void;
124
+ public abstract stopRendering(): void;
125
+
93
126
  public release(): void {
94
127
  this.removeRenderer();
95
128
  }
@@ -11,19 +11,32 @@ export class RendererCache extends IRendererCache {
11
11
  private videoFrame: VideoFrame;
12
12
  private _enabled: boolean;
13
13
 
14
+ // 渲染相关属性
15
+ private _renderingFps: number = 0;
16
+ private _renderingTimer?: number;
17
+ private _isRendering: boolean = false;
18
+ private _lastRenderTime: number = 0;
19
+
20
+ // 性能监控相关属性
21
+ private _frameTimes: number[] = []; // 存储最近100帧的渲染时间
22
+ private _frameIntervals: number[] = []; // 存储最近100帧的帧间隔
23
+ private _lastFrameTimestamp: number = 0; // 上一帧的时间戳
24
+ private _statsInterval: number = 100; // 每100帧输出一次统计
25
+
14
26
  constructor(context: RendererContext) {
15
27
  super(context);
16
28
  this.videoFrame = {
17
29
  yBuffer: Buffer.alloc(0),
18
30
  uBuffer: Buffer.alloc(0),
19
31
  vBuffer: Buffer.alloc(0),
20
- alphaBuffer: AgoraEnv.encodeAlpha ? Buffer.alloc(0) : undefined,
32
+ alphaBuffer: Buffer.alloc(0),
21
33
  width: 0,
22
34
  height: 0,
23
35
  yStride: 0,
24
36
  uStride: 0,
25
37
  vStride: 0,
26
38
  rotation: 0,
39
+ colorSpace: undefined,
27
40
  };
28
41
  this._enabled = false;
29
42
  }
@@ -39,6 +52,10 @@ export class RendererCache extends IRendererCache {
39
52
  if (this._enabled) return;
40
53
  AgoraElectronBridge.EnableVideoFrameCache(this.cacheContext);
41
54
  this._enabled = true;
55
+ if (AgoraEnv.AgoraRendererManager) {
56
+ this._renderingFps = AgoraEnv.AgoraRendererManager.renderingFps;
57
+ }
58
+ this.startRendering();
42
59
  }
43
60
 
44
61
  private disable() {
@@ -55,25 +72,30 @@ export class RendererCache extends IRendererCache {
55
72
  }
56
73
  }
57
74
 
58
- override draw() {
59
- let { ret, isNewFrame } = AgoraElectronBridge.GetVideoFrame(
75
+ override draw(): void {}
76
+
77
+ public fetchVideoFrame(): { hasMoreFrame: boolean; needRender: boolean } {
78
+ const renderAlpha = this.cacheContext.enableAlphaMask ?? false;
79
+ let needRender = false;
80
+ let { ret, hasMoreFrame } = AgoraElectronBridge.GetVideoFrame(
60
81
  this.cacheContext,
61
82
  this.videoFrame,
62
83
  {
63
- encodeAlpha: AgoraEnv.encodeAlpha,
84
+ renderAlpha: renderAlpha,
64
85
  }
65
86
  );
66
87
 
67
88
  switch (ret) {
68
89
  case 0: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::OK = 0
69
90
  //
91
+ needRender = true;
70
92
  break;
71
93
  case 1: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::RESIZED = 1
72
94
  const { yStride, uStride, vStride, height } = this.videoFrame;
73
95
  this.videoFrame.yBuffer = Buffer.alloc(yStride! * height!);
74
96
  this.videoFrame.uBuffer = Buffer.alloc(uStride! * height!);
75
97
  this.videoFrame.vBuffer = Buffer.alloc(vStride! * height!);
76
- if (AgoraEnv.encodeAlpha) {
98
+ if (renderAlpha) {
77
99
  this.videoFrame.alphaBuffer = Buffer.alloc(
78
100
  this.videoFrame.width! * this.videoFrame.height!
79
101
  );
@@ -83,26 +105,43 @@ export class RendererCache extends IRendererCache {
83
105
  this.cacheContext,
84
106
  this.videoFrame,
85
107
  {
86
- encodeAlpha: AgoraEnv.encodeAlpha,
108
+ renderAlpha: renderAlpha,
87
109
  }
88
110
  );
89
111
  ret = result.ret;
90
- isNewFrame = result.isNewFrame;
112
+ hasMoreFrame = result.hasMoreFrame;
113
+ needRender = false;
91
114
  break;
92
115
  case 2: // GET_VIDEO_FRAME_CACHE_RETURN_TYPE::NO_CACHE = 2
93
116
  logDebug('No renderer cache, please enable cache first');
94
- return;
117
+ return { hasMoreFrame: false, needRender: false };
95
118
  }
96
119
 
97
- if (!AgoraEnv.encodeAlpha) {
98
- this.videoFrame.alphaBuffer = undefined;
120
+ if (!renderAlpha) {
121
+ if (
122
+ this.videoFrame.alphaBuffer &&
123
+ this.videoFrame.alphaBuffer.length > 0
124
+ ) {
125
+ this.videoFrame.alphaBuffer = Buffer.alloc(0);
126
+ }
127
+ } else {
128
+ if (
129
+ !this.videoFrame.alphaBuffer ||
130
+ this.videoFrame.alphaBuffer.length === 0
131
+ ) {
132
+ this.videoFrame.alphaBuffer = Buffer.alloc(
133
+ this.videoFrame.width! * this.videoFrame.height!
134
+ );
135
+ }
99
136
  }
100
137
 
101
- if (isNewFrame) {
138
+ if (hasMoreFrame) {
102
139
  this.renderers.forEach((renderer) => {
103
- renderer.drawFrame(this.videoFrame);
140
+ renderer.drawFrame(this.cacheContext.uid!, this.videoFrame);
104
141
  });
105
142
  }
143
+
144
+ return { hasMoreFrame, needRender };
106
145
  }
107
146
 
108
147
  override addRenderer(renderer: IRenderer): void {
@@ -110,6 +149,155 @@ export class RendererCache extends IRendererCache {
110
149
  this.shouldEnable();
111
150
  }
112
151
 
152
+ /**
153
+ * 渲染当前视频帧
154
+ * 此方法假设已经通过fetchVideoFrame获取了新帧
155
+ */
156
+ public renderFrame() {
157
+ if (this.renderers.length === 0) return;
158
+
159
+ // 记录当前时间戳,用于计算帧间隔
160
+ const now = performance.now();
161
+
162
+ // 计算帧间隔并记录
163
+ if (this._lastFrameTimestamp > 0) {
164
+ const interval = now - this._lastFrameTimestamp;
165
+ this._frameIntervals.push(interval);
166
+ }
167
+ this._lastFrameTimestamp = now;
168
+
169
+ // 使用高精度计数器测量渲染时间
170
+ const renderStartTime = performance.now();
171
+
172
+ // 执行渲染
173
+ this.renderers.forEach((renderer) => {
174
+ renderer.drawFrame(this.cacheContext.uid!, this.videoFrame);
175
+ });
176
+
177
+ // 计算渲染耗时
178
+ const renderEndTime = performance.now();
179
+ const frameTime = renderEndTime - renderStartTime;
180
+
181
+ // 更新帧时间统计
182
+ this._frameTimes.push(frameTime);
183
+
184
+ // 每statsInterval帧输出一次统计信息
185
+ if (this._frameTimes.length >= this._statsInterval) {
186
+ this._outputPerformanceStats();
187
+ }
188
+ }
189
+
190
+ /**
191
+ * 输出性能统计信息
192
+ * 包括帧时间和帧间隔的统计数据
193
+ */
194
+ private _outputPerformanceStats(): void {
195
+ if (this._frameTimes.length === 0) return;
196
+
197
+ // 计算帧时间统计
198
+ this.avgFrameTime =
199
+ this._frameTimes.reduce((a, b) => a + b, 0) / this._frameTimes.length;
200
+ this.maxFrameTime = Math.max(...this._frameTimes);
201
+ this.minFrameTime = Math.min(...this._frameTimes);
202
+
203
+ // 计算帧间隔统计
204
+ this.avgFrameInterval = 0;
205
+ this.maxFrameInterval = 0;
206
+ this.minFrameInterval = Number.MAX_VALUE;
207
+
208
+ if (this._frameIntervals.length > 0) {
209
+ this.avgFrameInterval =
210
+ this._frameIntervals.reduce((a, b) => a + b, 0) /
211
+ this._frameIntervals.length;
212
+ this.maxFrameInterval = Math.max(...this._frameIntervals);
213
+ this.minFrameInterval = Math.min(...this._frameIntervals);
214
+ }
215
+
216
+ // 计算实际帧率
217
+ this.actualFps =
218
+ this._frameIntervals.length > 0
219
+ ? 1000 / this.avgFrameInterval
220
+ : this._renderingFps;
221
+
222
+ // 输出帧时间统计
223
+ logDebug(
224
+ `[FPS_STATS][UID:${this.callbackContext.connection.localUid}] 帧时间统计(${this._frameTimes.length}帧):`,
225
+ `平均=${this.avgFrameTime.toFixed(2)}ms`,
226
+ `最大=${this.maxFrameTime.toFixed(2)}ms`,
227
+ `最小=${this.minFrameTime.toFixed(2)}ms`
228
+ );
229
+
230
+ // 输出帧间隔统计
231
+ if (this._frameIntervals.length > 0) {
232
+ logDebug(
233
+ `[FPS_STATS][UID:${this.callbackContext.connection.localUid}] 帧间隔统计(${this._frameIntervals.length}帧):`,
234
+ `实际帧率=${this.actualFps.toFixed(2)}fps`,
235
+ `目标帧率=${this._renderingFps}fps`,
236
+ `平均=${this.avgFrameInterval.toFixed(2)}ms`,
237
+ `最大=${this.maxFrameInterval.toFixed(2)}ms`,
238
+ `最小=${this.minFrameInterval.toFixed(2)}ms`
239
+ );
240
+ }
241
+
242
+ // 重置统计数据
243
+ this._frameTimes = [];
244
+ this._frameIntervals = [];
245
+ }
246
+
247
+ /**
248
+ * 开始独立渲染循环
249
+ */
250
+ public startRendering() {
251
+ if (this._renderingTimer || this._isRendering) return;
252
+
253
+ this._isRendering = true;
254
+
255
+ const renderingLooper = () => {
256
+ if (!this._isRendering) return;
257
+
258
+ const currentTime = performance.now();
259
+ const timeSinceLastRender = this._lastRenderTime
260
+ ? currentTime - this._lastRenderTime
261
+ : 0;
262
+ const frameInterval = 1000 / this._renderingFps;
263
+
264
+ // 如果距离上次渲染的时间不足一帧间隔,等待
265
+ if (this._lastRenderTime && timeSinceLastRender < frameInterval) {
266
+ const waitTime = frameInterval - timeSinceLastRender;
267
+ this._renderingTimer = window.setTimeout(renderingLooper, waitTime);
268
+ return;
269
+ }
270
+
271
+ // 记录当前时间作为本次循环的开始时间
272
+ this._lastRenderTime = currentTime;
273
+
274
+ // 获取第一帧并渲染
275
+ // 无论hasMoreFrame是true还是false,都渲染当前帧
276
+ // 因为fetchVideoFrame总是会获取一帧数据(如果有的话)
277
+ let { hasMoreFrame, needRender } = this.fetchVideoFrame();
278
+ if (needRender) {
279
+ this.renderFrame();
280
+ }
281
+
282
+ // 如果hasMoreFrame为true,表示还有更多帧需要获取
283
+ while (hasMoreFrame) {
284
+ // 获取下一帧
285
+ let { hasMoreFrame: nextHasMoreFrame, needRender } =
286
+ this.fetchVideoFrame();
287
+ hasMoreFrame = nextHasMoreFrame;
288
+ if (needRender) {
289
+ this.renderFrame();
290
+ }
291
+ }
292
+
293
+ // 安排下一帧
294
+ this._renderingTimer = window.setTimeout(renderingLooper, 0);
295
+ };
296
+
297
+ // 启动渲染循环
298
+ this._renderingTimer = window.setTimeout(renderingLooper, 0);
299
+ }
300
+
113
301
  /**
114
302
  * Remove the specified renderer if it is specified, otherwise remove all renderers
115
303
  */
@@ -118,6 +306,17 @@ export class RendererCache extends IRendererCache {
118
306
  this.shouldEnable();
119
307
  }
120
308
 
309
+ public stopRendering() {
310
+ if (!this._isRendering) return;
311
+
312
+ if (this._renderingTimer) {
313
+ window.clearTimeout(this._renderingTimer);
314
+ this._renderingTimer = undefined;
315
+ }
316
+
317
+ this._isRendering = false;
318
+ }
319
+
121
320
  public release(): void {
122
321
  super.release();
123
322
  }