You need to enable JavaScript to run this app.
导航

自定义视频编解码

最近更新时间2024.02.05 20:28:25

首次发布时间2021.12.21 16:49:20

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

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

前提条件

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

自定义视频编码

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

alt

集成步骤

  1. 在加入音视频房间前,通过调用 setVideoSourceType 指定自定义编码视频源,你需要设置 VideoSourceTypekVideoSourceTypeEncodedWithoutAutoSimulcast = 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:
自定义编码视频发送端在可发送状态发生变化时,收到的回调onActiveVideoLayeronActiveVideoLayer:withVideoIndex:withActive:onActiveVideoLayeronActiveVideoLayer:withVideoIndex:withActive:

自定义视频解码

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

alt

集成步骤

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

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

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

  4. 调用 subscribeStreamsubscribeStream 订阅远端流。

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

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

API 调用时序

alt

API 参考

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

功能变更日志

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

相关文档

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