说明
LocalCustomVideoTrack 用于向已发布的轨道推送外部原始 YUV 视频帧(如白板、画布、播放器画面、第三方采集源),通过 RTCEngine.getLocalCustomVideoTrack 获取。它继承自 LocalVideoTrack,可直接作为 publishLocalVideo / unPublishLocalVideo 的输入轨道。
本页为接口参考;完整接入流程、帧格式转换与排查建议见 自定义推流。
输入的是未编码的原始 YUV(I420)帧,编码由 SDK 按预设参数完成,业务侧无需自行编码。
⚠️ 引擎限制:本轨道的帧输入仅在风远(StreamVendor.FY)与网宿(StreamVendor.WS)流媒体引擎下生效;网仕(StreamVendor.OOK)引擎下调用inputData不会产生任何效果,帧被直接丢弃,也不会有错误回调。引擎由服务端下发决定,枚举值参见 枚举定义。
属性
preOpt
preOpt.publish.desc决定该轨道的轨道描述,inputData也依据它定位目标轨道。- 轨道实例在 SDK 内部按单例缓存:重复调用
getLocalCustomVideoTrack(preOpt)返回同一实例,并把传入的preOpt覆盖到该实例上。若需要同时区分“自定义流”和“共享流”,应在切换预设后重新发布,不要在同一时刻按两套desc交替送帧。
LocalCustomVideoTrack 自身方法
inputData(yuv, width, height, strideY, strideU, strideV, rotation, stamp)
preOpt.publish.desc 查找已发布轨道并送入编码流水线;轨道尚未发布(或引擎不支持)时该帧被静默丢弃。参数说明:
返回值说明:无(
Unit)。
帧数据格式要求
- 必须是紧凑 I420:
Y平面width * height字节,紧接U平面(width/2) * (height/2)字节,再接同样大小的V平面,三段连续无空洞。 stride必须与紧凑布局一致(width、width/2、width/2)。SDK 当前按紧凑布局计算平面偏移,传入带 padding 的行跨度会导致画面错位/花屏。若上游数据带 padding(如 Camera2 的rowStride > width),请先按有效像素拷贝成紧凑数组再送入。- 长度不足会在送编码前抛出
IllegalArgumentException(Invalid I420 size)。 - 分辨率无需自行对齐编码器:SDK 会按设备编码器要求做对齐缩放;但
width/height必须为偶数。 - 送帧节奏由业务侧控制,帧率与码率上限由
preOpt决定,超出预设帧率的高频送帧只会增加无谓开销。
继承自 VideoTrack 的渲染方法
addPlayView / replacePlayView / removePlayView / removeAllPlayView 由基类 VideoTrack 提供,签名与 LocalScreenTrack 一致。
注意:SDK 不会把 inputData 送入的帧回显到这些渲染控件上(本地回显仅对摄像头轨道生效)。自定义视频的本地预览请由业务侧自行绘制数据源,无需给本轨道添加渲染控件。
典型接入流程
TRACK_SHARE)发布外部画面,改用 PreOptionCustomVideo.screen,或在发布时通过 PublishCustomOptions(desc = ...) 覆盖 desc:
注意事项
- 先发布、后送帧:
publishLocalVideo成功回调之后再调用inputData,否则帧会被丢弃且无任何提示。 desc要一致:若发布时用PublishCustomOptions覆盖了desc,SDK 会同步写回preOpt.publish.desc,inputData仍按最新的desc定位轨道;不要在业务侧另存一份旧desc做判断。- 发布/取消发布的回调合并:与摄像头一致,快速连续
publish/unpublish时中间被合并的调用可能不回调,以最后一次调用的回调或最终状态为准。 - 离会后需重新发布:
leave()会释放流媒体引擎,轨道实例仍在但发布状态已失效,重新入会后必须重新publishLocalVideo才能继续送帧;releaseSDK()还会清空本地轨道缓存,之后需重新调用getLocalCustomVideoTrack。 - 复用输入数组:
inputData内部会把数据拷贝进编码缓冲,调用返回后业务侧可立即复用该ByteArray,建议自行做缓冲池以降低 GC 压力。