视频裸流传输
更新时间: 2024/08/05 15:02:55
在一些需要与硬件配合的应用场景中,比如使用教室硬件设备进行线上教学,在利用硬件自身能力进行视频采集、编码的基础上,还需要良好的抗弱网传输能力。为了帮助拥有第三方视频编解码模块或自研编解码的开发者实现实时视频码流传输互通,NERTC SDK 为用户提供抗弱网、抗丢包的纯传输通道。
功能介绍
依托网易云信底层实时传输网络 WE-CAN(Communication Acceleration Network),NERTC 运用全球节点及抗弱网算法,提供低延时、高稳定性的音视频码流传输通道,大大减少延时、丢包等网络问题对音视频传输质量和体验的影响。
NERTC SDK 支持视频裸流传输,您可以向 NERTC SDK 提供自定义的 H.264 等格式的视频编码数据,并由 NERTC SDK 进行推流。
注意事项
使用 NERTC SDK 提供的裸流传输通道时,您需要自行管理视频流的采集、编解码、渲染和其他处理。
发送视频裸流
实现方法
- 调用
setExternalVideoSource
方法开启外部视频源数据输入;调用此方法时,您需要设置enable
参数为true
,并设置streamType
为kNERtcVideoStreamTypeMain
(主流) 或kNERtcVideoStreamTypeSub
(辅流)。自定义外部视频采集接口支持在通话过程中动态调用,接口设置在通话结束后仍然有效;若您需要关闭该功能,请在下次通话前再次调用此方法关闭自定义视频采集。
- 调用
enableLocalVideo
方法开启媒体传输通道;调用此方法时,您需要设置enable
参数为true
,并设置streamType
为kNERtcVideoStreamTypeMain
(主流) 或kNERtcVideoStreamTypeSub
(辅流)。若您开启的是外部视频主流输入,请开启对应的媒体主流传输通道,辅流同理。
- 您需要自行处理视频数据的采集与编码。
- 调用
pushExternalVideoEncodedFrame
方法推送外部视频主流或辅流编码帧,并通过NERtcVideoEncodedFrame
设置编码后的音频数据,包括视频编码器类型、NAL 帧数据类型、NAL 帧数据长度、视频帧宽高等。- 建议在推送外部视频编码帧时,不要同时调用
pushExternalVideoFrame
方法。 - 所有 NAL 帧数据长度之和不能超过
nalData
参数对应的数据总长度。
- 建议在推送外部视频编码帧时,不要同时调用
- 推送视频编码帧成功后,您可以通过
setVideoEncoderQosObserver
接口注册视频编码 QoS 信息监听器,通过返回的相关视频编码数据调整视频编码策略。相关回调如下:onRequestSendKeyFrame
:I 帧请求事件回调。onVideoCodecUpdated
:视频编码器类型信息回调。onBitrateUpdated
:视频码率信息回调。
示例代码
以实现视频主流编码帧传输为例,示例代码如下:
//开启外部视频输入
NERtcVideoStreamType streamType; //视频流类型,主流或辅流
NERtcEx.getInstance().setExternalVideoSource(streamType, true);
//打开本地视频
NERtcEx.getInstance().enableLocalVideo(true);
//在qosObserver中实现如下回调,做相应的处理
private NERtcVideoEncoderQosObserver encoderQosObserver = new NERtcVideoEncoderQosObserver() {
/**
* I 帧请求,收到此回调,如果是外部编码,请及时发送相应IDR 帧
*
* @param videoStreamType 视频类型
*/
@Override
public void onRequestSendKeyFrame(NERtcVideoStreamType videoStreamType) {
}
/**
* 码率信息
*
* @param bitrateBps 码率:kbps
* @param videoStreamType 视频类型
*/
@Override
public void onBitrateUpdated(int bitrateBps, NERtcVideoStreamType videoStreamType) {
}
/**
* 视频编码器类型信息回调,发布视频后会默认回调一次,后续如果编码器类型发生变更时就会回调。
* @note
* - 在视频编码器类型发生变更后,如果是外部编码,此时需要重置你的编码器。
*
* @param videoCodecType 编码器类型
* @param videoStreamType 视频类型
*/
@Override
public void onVideoCodecUpdated(NERtcVideoCodecType videoCodecType, NERtcVideoStreamType videoStreamType) {
}
};
//设置qos回调observer
NERtcEx.getInstance().setVideoEncoderQosObserver(encoderQosObserver);
//加入房间成功后再进行如下发送
NERtcVideoEncodedFrame frame = new NERtcVideoEncodedFrame();
frame.frameType = 帧类型;
frame.width = 视频宽;
frame.height = 视频高;
frame.codecType = 视频编码类型;
frame.timestampUs = 时间戳;
frame.nalData = 帧数据;
frame.nalLengths = 帧数据长度数组;
NERtcEx.getInstance().pushExternalVideoEncodedFrame(streamType, frame);
接收视频裸流
实现方法
-
在初始化前,调用
setParameters
方法关闭 NERTC SDK 的视频解码功能,SDK 将不会自动解码并渲染远端视频。 -
在初始化后,调用
setPreDecodeObserver
注册解码前媒体数据观测器。 -
远端发送音频流后,SDK 触发
onFrame
回调,通过preDecodeFrame
参数返回相关解码前媒体数据,包括用户的 UID、媒体数据类型、数据长度、视频帧宽高等。 -
您需要自行处理视频数据的解码与渲染。
示例代码
//在observer中实现以下回调方法,处理接收到的视频裸流数据
NERtcPreDecodeObserver rtcPreDecodeObserver = new NERtcPreDecodeObserver() {
/**
* 解码前媒体数据回调
* @param preDecodeFrame 解码前媒体数据
*/
@Override
public void onFrame(NERtcPreDecodeFrameInfo preDecodeFrame) {
}
};
//设置裸流接收回调observer
NERtcEx.getInstance().setPreDecodeObserver(rtcPreDecodeObserver);
API 参考
方法 | 功能描述 |
---|---|
setExternalVideoSource |
开启外部视频源数据输入 |
pushExternalVideoEncodedFrame |
推送外部视频主流或辅流编码帧 |
setVideoEncoderQosObserver |
注册视频编码 QoS 信息监听器 |
setPreDecodeObserver |
注册解码前媒体数据观测器 |
事件 | 事件描述 |
:-- | :-- |
onRequestSendKeyFrame |
I 帧请求事件回调 |
onVideoCodecUpdated |
视频编码器类型信息回调 |
onBitrateUpdated |
视频码率信息回调 |
onFrame |
解码前媒体数据回调 |