-
Creator 版本:3.6.0
-
目标平台:Android + iOS + macOS + Windows
我正在开发一个 Native 全平台 C++ SDK (一个 RTC 实时音视频 SDK ) 的 Cocos Creator TypeScript 封装层插件,利用 原生插件功能 和 sebind 进行插件开发;目前已经跑通了 TypeScript <-> C++ SDK 的接口调用和回调。
现在遇到关于视频渲染的问题:
C++ Native 侧有视频帧数据回调(本地摄像头预览画面、远端用户推流的实时音视频画面、媒体播放器播放的视频画面等等)
回调的视频帧数据是内存裸数据( BGRA32 / RGBA32 / NV12 / NV21 / I420 / … )。
如何把视频帧数据渲染到 Cocos Creator 的游戏场景上?
调研了一下,可能的方式是获取 Cocos Sprite 精灵对象的 Texture2D 的 OpenGL 纹理 ID,
将此纹理 ID 传递到 Native 侧,通过 glTexImage2D 把内存裸数据转成纹理,
并绑定到此 Sprite 对象的纹理 ID 上。
找到了个 v2.4 版本的实现,但好像部分 API 在 v3.6 上没有了
var AgoraVideoRender = cc.Class({
extends: cc.Component,
properties: {
sprite: {
default: null,
type: cc.Sprite
},
uid: 0
},
onLoad() {
this.texture = new cc.Texture2D();
// Cocos Creator v3.6.0 没有 initWithData() API
this.texture.initWithData(null, cc.Texture2D.PixelFormat.RGBA8888, this.node.width, this.node.height);
this.sprite.spriteFrame = new cc.SpriteFrame(this.texture);
},
_updateSize() {
this.texture.width = this.node.width;
this.texture.height = this.node.height;
},
onEnable() {
this.node.on('size-changed', this._updateSize, this)
},
onDisable() {
this.node.off('size-changed', this._updateSize, this)
},
update(dt) {
if (agora && agora.bridge && agora.bridge.bindTextureId) {
// v3.6.0 没有 getImpl() API
agora.bridge.bindTextureId(this.texture.getImpl().getHandle(), this.uid);
}
},
});
所以这里的问题是 v3.6.0 如何获取 Sprite 对象的 OpenGL 纹理 ID?
或者说,是否有其他更好的方案来实现视频帧数据在游戏场景中的渲染?
另外还有一个关于视频画面更新的驱动方式,不大清楚下面哪种方案是可行的:
-
Sprite 自刷新回调并从 native 获取、绑定最新的视频帧;
是否有这种回调?(比如屏幕刷新驱动回调?类似 iOS 的 CADisplayLink?)
update(deltaTime: number)能否满足这个需求?这个回调的触发时机是什么? -
当 Native 侧数据有更新时主动更新 Sprite 的 texture
可能需要 native 侧持有这个 Sprite 对象并修改这个对象的属性;
是否能直接修改 Sprite 对象绑定的纹理 ID?



也可以在 GitHub 提 issue,项目是开源的:
看起来不错,等3.7发布后试试


就是不支持h5 只有原生安卓 ios。 后面更新了win版本