视频裸流传输
更新时间: 2024/09/18 16:26:13
在一些需要与硬件配合的应用场景中,比如使用教室硬件设备进行线上教学,在利用硬件自身能力进行视频采集、编码的基础上,还需要良好的抗弱网传输能力。若您拥有第三方视频编解码模块或有能力自研编解码,为了实现实时视频码流传输互通,NERTC SDK 为您提供抗弱网、抗丢包的纯传输通道。
功能介绍
依托网易云信底层实时传输网络 WE-CAN(Communication Acceleration Network),NERTC 运用全球节点及抗弱网算法,提供低延时、高稳定性的音视频码流传输通道,大大减少延时、丢包等网络问题对音视频传输质量和体验的影响。
NERTC SDK 支持视频裸流传输,您可以向 NERTC SDK 提供自定义的 H.264 等格式的视频编码数据,并由 NERTC SDK 进行推流。
注意事项
使用 NERTC SDK 提供的裸流传输通道时,您需要自行管理视频流的采集、编解码、渲染和其他处理。
发送视频裸流
实现方法
- 调用
setExternalVideoSource
方法开启外部视频源数据输入;调用此方法时,您需要设置enable
参数为true
,并设置streamType
为kNERtcStreamChannelTypeMainStream
(主流) 或kNERtcStreamChannelTypeSubStream
(辅流)。- 自定义外部视频采集接口支持在通话过程中动态调用,接口设置在通话结束后仍然有效;若您需要关闭该功能,请在下次通话前再次调用此方法关闭自定义视频采集。
- 暂不支持同时开启视频主、辅流通道推送外部视频编码帧数据。
- 调用
enableLocalVideo
方法开启本地视频采集;调用此方法时,您需要设置enable
参数为true
,并设置streamType
为kNERtcStreamChannelTypeMainStream
(主流) 或kNERtcStreamChannelTypeSubStream
(辅流)。若您开启的是外部视频主流输入,请开启对应的媒体主流传输通道,辅流同理。
- 您需要自行处理视频数据的采集与编码。
- 调用
pushExternalVideoEncodedFrame
方法推送外部视频主流编码帧或调用pushExternalSubStreamVideoEncodedFrame
方法推送外部视频辅流编码帧,并通过NERtcVideoEncodedFrame
设置编码后的音频数据,包括视频编码器类型、NAL 帧数据类型、NAL 帧数据长度、视频帧宽高等。- 建议在推送外部视频编码帧时,不要同时调用
pushExternalVideoFrame
方法。 - 所有 NAL 帧数据长度之和不能超过
nalData
参数对应的数据总长度。
- 建议在推送外部视频编码帧时,不要同时调用
- 推送视频编码帧成功后,您可以通过
setVideoEncoderQosObserver
接口注册视频编码 QoS 信息监听器,通过返回的相关视频编码数据调整视频编码策略。相关回调如下:onNERtcEngineRequestSendKeyFrame
:I 帧请求事件回调。onNERtcEngineVideoCodecUpdated
:视频编码器类型信息回调。onNERtcEngineBitrateUpdated
:视频码率信息回调。
示例代码
以实现视频主流编码帧传输为例,示例代码如下:
//以实现发送视频主流编码后数据为例
//开启外部视频输入
[[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 {
}
接收视频裸流
实现方法
-
在初始化前,调用
setParameters
方法关闭 NERTC SDK 的视频解码功能,SDK 将不会自动解码并渲染远端视频。 -
在初始化后,调用
setPreDecodeObserver
注册解码前媒体数据观测器。 -
远端发送音频流后,SDK 触发
onNERtcEnginePreDecoderFrame
回调,通过preDecodeFrame
参数返回相关解码前媒体数据,包括用户的 UID、媒体数据类型、数据长度、视频帧宽高等。 -
您需要自行处理视频数据的解码与渲染。
示例代码
//设置裸流接收回调observer
[[NERtcEngine sharedEngine] setPreDecodeObserver:observer];
//在observer中实现以下回调方法,处理接收到的视频裸流数据
- (void)onNERtcEnginePreDecoderFrame:(NERtcPreDecoderFrameInfo *)preDecoderFrame {
}
API 参考
方法 | 功能描述 |
---|---|
setExternalVideoSource |
开启外部视频源数据输入 |
pushExternalVideoEncodedFrame |
推送外部视频主流编码帧 |
pushExternalSubStreamVideoEncodedFrame |
推送外部视频辅流编码帧 |
setVideoEncoderQosObserver |
注册视频编码 QoS 信息监听器 |
setPreDecodeObserver |
注册解码前媒体数据观测器 |
事件 | 事件描述 |
---|---|
onNERtcEngineRequestSendKeyFrame |
I 帧请求事件回调 |
onNERtcEngineVideoCodecUpdated |
视频编码器类型信息回调 |
onNERtcEngineBitrateUpdated |
视频码率信息回调 |
onNERtcEnginePreDecoderFrame |
解码前媒体数据回调 |
此文档是否对你有帮助?