自定义视频采集

功能介绍

ARTC SDK支持客户自定义视频采集的功能,客户通过此功能实自定义管理视频设备,且阿里云支持动态切换内部采集和外部采集。

实现步骤

image

代码实现

打开或关闭内部采集

  • android平台

    /* 关闭内部采集 */
    mAliRtcEngine.enableLocalVideo(false);
    
    /* 打开内部采集,阿里内部默认状态是true,所以如果不需要控制的情况下不需要调用此api */
    mAliRtcEngine.enableLocalVideo(true);
  • ios平台

    /* 关闭内部采集 */
    [_engine enableLocalVideo:NO];
    
    /* 打开内部采集,阿里内部默认状态是true,所以如果不需要控制的情况下不需要调用此api */
    [_engine enableLocalVideo:YES];

开启或关闭外部视频源

  • android平台

    /* 特别说明:这里以非纹理的方式示例,目前SDK也可以以纹理的方式输入数据 */
    /* 打开外部采集,这里以camera流为例,具体可以根据sourceType指定,渲染模式也可以根据需要指定 */
    mAliRtcEngine.setExternalVideoSource(true,false, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );
    
    /* 关闭外部采集,这里以camera流为例,具体可以根据sourceType指定 */
    mAliRtcEngine.setExternalVideoSource(false,false, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );
  • ios平台

    /* 打开外部采集,这里以camera流为例,具体可以根据sourceType指定,渲染模式也可以根据需要指定 */
    [_engine setExternalVideoSource:YES sourceType:AliRtcVideosourceCameraType renderMode:AliRtcRenderModeAuto]; 
    
    /* 关闭外部采集,这里以camera流为例,具体可以根据sourceType指定 */
    [_engine setExternalVideoSource:NO sourceType:AliRtcVideosourceCameraType renderMode:AliRtcRenderModeAuto]; 

向SDK输入外部的视频源

  • android平台

    /* 按照自己的数据格式填写以下内容,下面以I420格式为例 */
    int width = 720;
    int height = 1280;
    AliRtcEngine.AliRtcVideoFormat videoformat = AliRtcEngine.AliRtcVideoFormat.AliRtcVideoFormatI420;
    int[] lineSize = {width, width / 2, width / 2, 0};
    int frameLength = width * height * 3 / 2;
    byte[] buffer = new byte[frameLength];
    
    /* 构造传入SDK的数据对象 */
    AliRtcEngine.AliRtcRawDataFrame rawDataFrame
            = new AliRtcEngine.AliRtcRawDataFrame(buffer,
                                                 videoformat,
                                                 width, 
                                                 height, 
                                                 lineSize, 
                                                 0, 
                                                 buffer.length);
    
    /* 调用API传入数据对象 */
    int ret = mAliRtcEngine.pushExternalVideoFrame(rawDataFrame, AliRtcVideoTrackCamera);
    if (ret != 0) {
        /* 打印下错误信息 */
    }
  • ios平台

    /* 按照自己的数据格式填写以下内容,下面以I420格式为例 */
    AliRtcVideoDataSample *dataSample = [[AliRtcVideoDataSample alloc] init];
    dataSample.dataPtr = (long)yuv_read_data;
    dataSample.format = AliRtcVideoFormat_I420;
    dataSample.type = AliRtcBufferType_Raw_Data;
    dataSample.width = width;
    dataSample.height = height;
    dataSample.strideY = width;
    dataSample.strideU = width/2;
    dataSample.strideV = width/2;
    dataSample.dataLength = dataSample.strideY * dataSample.height * 3/2;
    
    /* 调用API传入数据对象 */
    int ret = [self.engine pushExternalVideoFrame:dataSample sourceType:AliRtcVideosourceCameraType];
    if (ret != 0) {
        /* 打印下错误信息 */
    }