当你使用 RTC 实现实时音视频通信时,RTC 默认使用内部的编解码模块进行视频编解码。然而在一些场景下,你可能会发现内部编解码模块无法满足需求,比如:音视频应用中已实现了视频编解码模块,此时 RTC 再进行二次编解码有可能会产生延时和视频质量的损耗。

你可以参考本文,将自定义编码后的视频源,交由 RTC 进行传输,或对 RTC 拉取到的远端编码后视频源进行自定义解码渲染。

功能变更日志
  1. 自客户端版本 v3.29 起,支持自定义视频编码功能。
  2. 自客户端版本 v3.56 起,发送端可以根据 onActiveVideoLayer,按需编码。
前提条件

你已经集成 v3.29 或更高版本的 RTC SDK。

功能实现
自定义视频编码

集成步骤和时序图中的接口以 Windows 平台为例,参考对应平台的 API 文档获取更多信息。
自定义编码的流程如下图所示。

alt

集成步骤
  1. 在加入音视频房间前,通过调用 setVideoSourceType 指定自定义编码视频源,你需要设置 VideoSourceType 为 kVideoSourceTypeEncodedWithoutAutoSimulcast = 3。

  2. 调用 setExternalVideoEncoderEventHandler 注册自定义编码帧推送事件回调。

  3. (可选)调用 setVideoEncoderConfig 设置每路视频流的参数。

  4. 你必须自行实现视频编码逻辑。出于节约本端编码性能消耗的考虑,推荐你根据 onActiveVideoLayer,按需编码。

  5. 编码完成后,你需要在收到 onStart 回调通知后调用 pushExternalEncodedVideoFrame 将编码后的视频帧推送至 RTC SDK 进行传输。你必须根据实际编码时使用的参数来设置 pushExternalEncodedVideoFrame 中的 IEncodedVideoFrame。

注意

  • 外部编码器推送给 SDK 的帧必须是完整的一帧,且只支持 IDR 帧和 P 帧,不支持推送多个帧拼接。
  • 在收到 IExternalVideoEncoderEventHandler 回调的 onRequestKeyFrame 时,必须重新编码一个 I 帧发送,否则订阅端会因为收不到 I 帧导致解码失败。
API 调用时序

alt

API 参考
功能/平台
Android
iOS
Windows
macOS
设置自定义编码帧推送事件回调setExternalVideoEncoderEventHandlersetExternalVideoEncoderEventHandler:setExternalVideoEncoderEventHandlersetExternalVideoEncoderEventHandler:
设置视频输入源setVideoSourceTypesetVideoSourceType:WithStreamIndex:setVideoSourceType:WithStreamIndex:setVideoSourceType
设置多路流参数setVideoEncoderConfigsetVideoEncoderConfig:config:setVideoEncoderConfigsetVideoEncoderConfig:config:
推送编码后视频帧pushExternalEncodedVideoFramepushExternalEncodedVideoFrame:withVideoIndex:withEncodedVideoFrame:pushExternalEncodedVideoFramepushExternalEncodedVideoFrame:withVideoIndex:withEncodedVideoFrame:
自定义编码视频发送端在可发送状态发生变化时,收到的回调onActiveVideoLayeronActiveVideoLayeronActiveVideoLayeronActiveVideoLayer
自定义视频解码

集成步骤和时序图中的接口以 Windows 平台为例,参考对应平台的 API 文档获取更多信息。
自定义解码的流程如下图所示。

alt

集成步骤
  1. 在加入音视频房间前,通过调用 registerRemoteEncodedVideoFrameObserver 注册远端编码后视频帧回调。

  2. 调用 joinRoom 加入房间,将订阅模式指定为手动订阅。

  3. 通过 onUserPublishStream 或 onUserPublishScreen 获取到远端流信息后,调用 setVideoDecoderConfig 将远端视频数据解码方式设置为自定义解码。

  4. 调用 subscribeStream 或 subscribeStream 订阅远端流。

  5. 当 SDK 监测到远端编码后视频数据时触发 onRemoteEncodedVideoFrame,你需要自行实现视频解码逻辑。

  6. 自定义解码失败时,调用 requestRemoteVideoKeyFrame 向远端请求关键帧。

API 调用时序

alt

API 参考
功能/平台
Android
iOS
Windows
macOS
注册远端编码后视频数据回调registerRemoteEncodedVideoFrameObserverregisterRemoteEncodedVideoFrameObserver:registerRemoteEncodedVideoFrameObserverregisterRemoteEncodedVideoFrameObserver:
设置远端视频数据解码方式setVideoDecoderConfigsetVideoDecoderConfig:withVideoDecoderConfig:setVideoDecoderConfigsetVideoDecoderConfig:withVideoDecoderConfig:
请求远端关键帧requestRemoteVideoKeyFramerequestRemoteVideoKeyFrame:requestRemoteVideoKeyFramerequestRemoteVideoKeyFrame:
相关文档

切换内部和自定义视频编码模块