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

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

前提条件

你已经集成 v3.29 或更高版本的 RTC SDK,实现了基本的音视频通话。

集成步骤
自定义视频编码
  1. 在加入音视频房间前,通过调用 setVideoSourceType 指定自定义编码视频源。

  2. 如果需要推送多路编码后的视频流,需调用 setVideoEncoderConfig 设置每路视频流的参数。

  3. 你必须自行实现视频编码逻辑。

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

API 调用时序可以参考下图(以 Windows 为例):

alt

自定义编码的数据流转如下图:

image

API 参考
功能/平台AndroidiOSWindowsmacOS
设置自定义编码帧推送事件回调setExternalVideoEncoderEventHandlersetExternalVideoEncoderEventHandler:setExternalVideoEncoderEventHandlersetExternalVideoEncoderEventHandler:
设置视频输入源setVideoSourceTypesetVideoSourceType:WithStreamIndex:setVideoSourceType:WithStreamIndex:setVideoSourceType
设置多路流参数setVideoEncoderConfigsetVideoEncoderConfig:config:setVideoEncoderConfigsetVideoEncoderConfig:config:
推送编码后视频帧pushExternalEncodedVideoFramepushExternalEncodedVideoFrame:withVideoIndex:withEncodedVideoFrame:pushExternalEncodedVideoFramepushExternalEncodedVideoFrame:withVideoIndex:withEncodedVideoFrame:
自定义视频解码
  1. 在加入音视频房间前,通过调用 registerRemoteEncodedVideoFrameObserver 注册远端编码后视频帧回调。

  2. 加入房间获取到远端流信息后,调用 setVideoDecoderConfig 将远端视频数据解码方式设置为自定义解码。

  3. 订阅远端流后,当 SDK 监测到远端编码后视频数据时触发 OnRemoteEncodedVideoFrame,你必须自行实现视频解码逻辑。

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

API 调用时序可以参考下图(以 Windows 为例):

alt

自定义解码的数据流转如下图:

image

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

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