自定义视频采集,是指由开发者自行采集视频,向 ZEGO Express SDK 提供视频数据,并由 ZEGO Express SDK 进行编码推流的功能。当用户开启自定义视频采集的功能后,默认情况下,ZEGO Express SDK 在推流端内部将对本端预览画面进行渲染,用户无需自行进行渲染。
当开发者业务中出现以下情况时,推荐使用 SDK 的自定义视频采集功能:
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/Examples/AdvancedVideoProcessing/CustomVideoCapture” 目录下的文件。
在进行自定义视频采集前,请确保:
API 接口调用的时序图如下:
开启自定义视频采集功能时,需要将 enableCamera 接口保持默认配置 “True”,否则推流没有视频数据。
由于采集的多样性,SDK 支持多种视频帧数据类型 bufferType,开发者需告知 SDK 使用的数据类型。目前 SDK 支持如下视频帧数据类型:
设置为其他枚举值,将无法向 SDK 提供视频帧数据。
ZegoCustomVideoCaptureConfig captureConfig;
captureConfig.bufferType = ZEGO_VIDEO_BUFFER_TYPE_RAW_DATA;
engine->enableCustomVideoCapture(true, &captureConfig);
调用 setCustomVideoCaptureHandler 设置自定义视频采集回调,实现 onStart 和 onStop 自定义采集回调方法。
// 继承自 IZegoCustomVideoCaptureHandler,实现自定义渲染回调
class MyZegoCustomVideoCaptureHandler: public IZegoCustomVideoCaptureHandler{
// SDK 通知将要开始采集视频帧,收到该回调后向 SDK 发送的视频帧数据才有效
// @param channel 推流通道
void onStart(ZegoPublishChannel channel) override{
}
// SDK 通知将要停止采集视频帧
// @param channel 推流通道
void onStop(ZegoPublishChannel channel) override{
}
}
// 为引擎设置自定义采集回调
engine->setCustomVideoCaptureHandler(std::make_shared<MyZegoCustomVideoCaptureHandler>());
调用开始预览接口 startPreview 或者开始推流接口 startPublishingStream 后,将会触发 onStart 回调;停止推流/预览后,退出房间或销毁引擎时,将会触发 onStop 回调。
SDK 只有在 onStart 触发后、onStop 触发前,才会接受用户传递的视频数据,调用发送自定义采集的视频帧数据接口向 SDK 发送视频帧数据,自定义采集的视频帧数据接口与 1 开启自定义视频采集 中向 SDK 提供视频帧数据类型 bufferType 一一对应:
视频帧类型 | bufferType | 发送视频帧数据接口 |
---|---|---|
裸数据类型 | ZEGO_VIDEO_BUFFER_TYPE_RAW_DATA | sendCustomVideoCaptureRawData |
编码类型 | ZEGO_VIDEO_BUFFER_TYPE_ENCODED_DATA | sendCustomVideoCaptureEncodedData |
在进行外部采集时,如果通过 sendCustomVideoCaptureEncodedData 接口向 SDK 发送的是视频帧编码后的数据,SDK 将无法预览,此时开发者需要自行预览。
以在接收到摄像头视频帧回调后,调用 sendCustomVideoCaptureRawData 接口向 SDK 发送视频帧数据为例:
ZegoExpressSDK::getEngine()->sendCustomVideoCaptureRawData(videoFrame->data.get(), videoFrame->dataLength, videoFrame->param, videoFrame->referenceTimeMillsecond);
收到 onStart 回调后,可以根据需要调用 setCustomVideoCaptureDeviceState 接口,指定推流通道的自定义采集设备状态。
拉流端可以通过监听 onRemoteCameraStateUpdate 回调,获取推流端设备状态。
ZEGO_REMOTE_DEVICE_STATE_DISABLE
或 ZEGO_REMOTE_DEVICE_STATE_MUTE
都无效,即拉流端无法收到 onRemoteCameraStateUpdate 回调。ZEGO_REMOTE_DEVICE_STATE_DISABLE
状态,此时推流没有视频数据。ZEGO_REMOTE_DEVICE_STATE_MUTE
状态。使用自定义视频采集,本地预览的画面正常,推流后观众端看到的画面变形了,该怎么处理?
该问题是由于自定义视频采集到的图像比例,与 SDK 默认的分辨率比例不一致造成的。例如,自定义视频采集到的视频帧画面比例是 4:3,SDK 默认推流画面分辨率比例是 16:9。
有如下解决方案:
方案一:开发者将自定义视频采集的视频分辨率比例手动修改为 16:9。
方案二:开发者调用 setVideoConfig 接口,将 SDK 的推流分辨率比例自定义为 4:3。
方案三:开发者调用 setCustomVideoCaptureFillMode 接口,设置视频采集画面缩放填充模式为 “ZEGO_VIEW_MODE_ASPECT_FIT”(等比缩放、可能有黑边)或者 “ZEGO_VIEW_MODE_ASPECT_FILL”(等比填充、可能有部分画面被裁剪)。
开启自定义视频采集后,采集的帧率和拉流播放帧率不一致?
向 SDK 提供 ZEGO_VIDEO_BUFFER_TYPE_RAW_DATA
类型视频帧数据时,设置 setVideoConfig 接口的帧率和调用自定义采集 sendCustomVideoCaptureRawData 接口提供的视频数据的帧率需要保持一致。
SDK 接收视频帧数据方法内部对传入的数据是同步处理还是异步处理?
SDK 接收视频帧数据后,会先同步拷贝数据,然后再异步执行编码等操作,所以在将数据传入 SDK 后即可立即释放。
联系我们
文档反馈