当你使用 RTC 实现实时音视频通信时,RTC 默认使用内部的编解码模块进行视频编解码。然而在一些场景下,你可能会发现内部编解码模块无法满足需求,比如:音视频应用中已实现了视频编解码模块,此时 RTC 再进行二次编解码有可能会产生延时和视频质量的损耗。
你可以参考本文,将自定义编码后的视频源,交由 RTC 进行传输,或对 RTC 拉取到的远端编码后视频源进行自定义解码渲染。
你已经集成 v3.29 或更高版本的 RTC SDK。
集成步骤和时序图中的接口以 Windows 平台为例,参考对应平台的 API 文档获取更多信息。
自定义编码的流程如下图所示。
在加入音视频房间前,通过调用 setVideoSourceType 指定自定义编码视频源,你需要设置 VideoSourceType
为 kVideoSourceTypeEncodedWithoutAutoSimulcast = 3
。
调用 setExternalVideoEncoderEventHandler 注册自定义编码帧推送事件回调。
(可选)调用 setVideoEncoderConfig 设置每路视频流的参数。
你必须自行实现视频编码逻辑。出于节约本端编码性能消耗的考虑,推荐你根据 onActiveVideoLayer
,按需编码。
编码完成后,你需要在收到 onStart
回调通知后调用 pushExternalEncodedVideoFrame
将编码后的视频帧推送至 RTC SDK 进行传输。你必须根据实际编码时使用的参数来设置 pushExternalEncodedVideoFrame
中的 IEncodedVideoFrame
。
注意
IExternalVideoEncoderEventHandler
回调的 onRequestKeyFrame 时,必须重新编码一个 I 帧发送,否则订阅端会因为收不到 I 帧导致解码失败。集成步骤和时序图中的接口以 Windows 平台为例,参考对应平台的 API 文档获取更多信息。
自定义解码的流程如下图所示。
在加入音视频房间前,通过调用 registerRemoteEncodedVideoFrameObserver 注册远端编码后视频帧回调。
调用 joinRoom 加入房间,将订阅模式指定为手动订阅。
通过 onUserPublishStream 或 onUserPublishScreen 获取到远端流信息后,调用 setVideoDecoderConfig 将远端视频数据解码方式设置为自定义解码。
调用 subscribeStream 或 subscribeScreen 订阅远端流。
当 SDK 监测到远端编码后视频数据时触发 onRemoteEncodedVideoFrame,你需要自行实现视频解码逻辑。
自定义解码失败时,调用 requestRemoteVideoKeyFrame 向远端请求关键帧。
onActiveVideoLayer
,按需编码。