视频裸流传输

更新时间: 2024/09/18 16:26:13

在一些需要与硬件配合的应用场景中,比如使用教室硬件设备进行线上教学,在利用硬件自身能力进行视频采集、编码的基础上,还需要良好的抗弱网传输能力。若您拥有第三方视频编解码模块或有能力自研编解码,为了实现实时视频码流传输互通,NERTC SDK 为您提供抗弱网、抗丢包的纯传输通道。

功能介绍

依托网易云信底层实时传输网络 WE-CAN(Communication Acceleration Network),NERTC 运用全球节点及抗弱网算法,提供低延时、高稳定性的音视频码流传输通道,大大减少延时、丢包等网络问题对音视频传输质量和体验的影响。

NERTC SDK 支持视频裸流传输,您可以向 NERTC SDK 提供自定义的 H.264 等格式的视频编码数据,并由 NERTC SDK 进行推流。

注意事项

使用 NERTC SDK 提供的裸流传输通道时,您需要自行管理视频流的采集、编解码、渲染和其他处理。

发送视频裸流

实现方法

  1. 调用 setExternalVideoSource 方法开启外部视频源数据输入;调用此方法时,您需要设置 enable 参数为 true,并设置 streamTypekNERtcStreamChannelTypeMainStream(主流) 或 kNERtcStreamChannelTypeSubStream(辅流)。
    • 自定义外部视频采集接口支持在通话过程中动态调用,接口设置在通话结束后仍然有效;若您需要关闭该功能,请在下次通话前再次调用此方法关闭自定义视频采集。
    • 暂不支持同时开启视频主、辅流通道推送外部视频编码帧数据。
  2. 调用 enableLocalVideo 方法开启本地视频采集;调用此方法时,您需要设置 enable 参数为 true,并设置 streamTypekNERtcStreamChannelTypeMainStream(主流) 或 kNERtcStreamChannelTypeSubStream(辅流)。

    若您开启的是外部视频主流输入,请开启对应的媒体主流传输通道,辅流同理。

  3. 您需要自行处理视频数据的采集与编码。
  4. 调用 pushExternalVideoEncodedFrame 方法推送外部视频主流编码帧或调用 pushExternalSubStreamVideoEncodedFrame 方法推送外部视频辅流编码帧,并通过 NERtcVideoEncodedFrame 设置编码后的音频数据,包括视频编码器类型、NAL 帧数据类型、NAL 帧数据长度、视频帧宽高等。
    • 建议在推送外部视频编码帧时,不要同时调用 pushExternalVideoFrame 方法。
    • 所有 NAL 帧数据长度之和不能超过 nalData 参数对应的数据总长度。
  5. 推送视频编码帧成功后,您可以通过 setVideoEncoderQosObserver 接口注册视频编码 QoS 信息监听器,通过返回的相关视频编码数据调整视频编码策略。相关回调如下:

示例代码

以实现视频主流编码帧传输为例,示例代码如下:

//以实现发送视频主流编码后数据为例

//开启外部视频输入
[[NERtcEngine sharedEngine] setExternalVideoSource:YES isScreen:是否为主流视频];
//打开本地视频
[[NERtcEngine sharedEngine] enableLocalVideo:YES];
//设置qos回调observer
[[NERtcEngine sharedEngine] setVideoEncoderQosObserver:qosobserver];
  
//加入房间成功后再进行如下发送
//发送编码后视频裸流(以下代码为单帧数据输入示例,需要放在合适的编码数据数据的位置)
NERtcVideoEncodedFrame *frame = [[NERtcVideoEncodedFrame alloc] init];
frame.frameType = 帧类型;
frame.width = 视频宽;
frame.height = 视频高;
frame.codecType = 视频编码类型;
frame.timestampUs = 时间戳;
frame.nalData = 帧数据;
frame.nalLengths = 帧数据长度数组;
[[NERtcEngine sharedEngine] pushExternalVideoEncodedFrame:frame];

//在qosObserver中实现如下回调,做相应的处理
//I 帧请求,收到此回调,如果是外部编码,请及时发送相应IDR 帧
- (void)onNERtcEngineRequestSendKeyFrame:(NERtcStreamChannelType)videoStreamType {
}
//码率信息更新请求,需要更新编码码率
- (void)onNERtcEngineBitrateUpdated:(int)bitrateBps
                    videoStreamType:(NERtcStreamChannelType)videoStreamType {
}
//视频编码器类型信息回调,发布视频后会默认回调一次,后续如果编码器类型发生变更时就会回调。
- (void)onNERtcEngineVideoCodecUpdated:(NERtcVideoCodecType)videoCodecType
                       videoStreamType:(NERtcStreamChannelType)videoStreamType {
}

接收视频裸流

实现方法

  1. 在初始化前,调用 setParameters 方法关闭 NERTC SDK 的视频解码功能,SDK 将不会自动解码并渲染远端视频。

  2. 在初始化后,调用 setPreDecodeObserver 注册解码前媒体数据观测器。

  3. 远端发送音频流后,SDK 触发 onNERtcEnginePreDecoderFrame 回调,通过 preDecodeFrame 参数返回相关解码前媒体数据,包括用户的 UID、媒体数据类型、数据长度、视频帧宽高等。

  4. 您需要自行处理视频数据的解码与渲染。

示例代码

//设置裸流接收回调observer
[[NERtcEngine sharedEngine] setPreDecodeObserver:observer];
//在observer中实现以下回调方法,处理接收到的视频裸流数据
- (void)onNERtcEnginePreDecoderFrame:(NERtcPreDecoderFrameInfo *)preDecoderFrame {
}

API 参考

方法 功能描述
setExternalVideoSource 开启外部视频源数据输入
pushExternalVideoEncodedFrame 推送外部视频主流编码帧
pushExternalSubStreamVideoEncodedFrame 推送外部视频辅流编码帧
setVideoEncoderQosObserver 注册视频编码 QoS 信息监听器
setPreDecodeObserver 注册解码前媒体数据观测器
事件 事件描述
onNERtcEngineRequestSendKeyFrame I 帧请求事件回调
onNERtcEngineVideoCodecUpdated 视频编码器类型信息回调
onNERtcEngineBitrateUpdated 视频码率信息回调
onNERtcEnginePreDecoderFrame 解码前媒体数据回调
此文档是否对你有帮助?
有帮助
去反馈
  • 功能介绍
  • 注意事项
  • 发送视频裸流
  • 实现方法
  • 示例代码
  • 接收视频裸流
  • 实现方法
  • 示例代码
  • API 参考