更新时间:2024-11-18 GMT+08:00
分享

启动视频服务

接口介绍

int OpenVideo(const char* jsonConfig, VideoCallback callback);

功能描述

启动视频采集服务。

如需视频编码后出流,推荐使用外置编码方案,有助于降低编码时延和云手机资源消耗,并且外置编码可支持h265编码出流。

输入参数

表1 输入参数说明

参数名称

说明

jsonConfig

视频初始化参数json串,详见表2

callback

视频数据回调函数。

表2 jsonConfig参数说明

参数名称

参数类型

说明

frame_type

string

出流帧类型,默认值为“h264”,可根据需要设置为“yuv”, “h265”。

encode_type

number

编码类型,默认值为0(AUTO模式)。

在AUTO模式下,系统会自动选择编码类型:优先使用外置编码,当外置编码不可用时,将自动切换云手机CPU软编码。

AUTO模式下自动切换CPU软编码存在以下两种例外情况:

  1. 由于CPU软编仅支持h264,当frame_type设置为“h265”时,无法自动切换;
  2. 当使用AUTO模式,但资源池elb ip或port配置非法,系统将返回错误码,无法自动切换。

说明:

  • 支持指定为1(CPU软编码)。
  • 支持指定为5(独立编码卡),支持H264/H265帧类型,需要用户业务程序拥有root权限。可调用获取媒体服务支持能力接口查询“IndependentHardwareEncode”字段是否有效。

fps

number

编码帧率,默认值为云手机规格的帧率,设置范围[10, 云手机规格的帧率],支持设置为10的倍数。

bitrate

number

编码码率,720p默认值:3M,1080p默认值:6M,设置范围[100000, 10000000]

基于编码画质最大保障和传输带宽最大节约,编码码率建议值如下:

游戏多开场景(30fps):

720p/h264: 2M(高清)1.3M(标清)1M(流畅)

720p/h265: 1.3M(高清)1M(标清)0.7M(流畅)

1080p/h264: 4M(高清)2.6M(标清)2M(流畅)

1080p/h265: 2.6M(高清)2M(标清)1.4M(流畅)

云游戏场景(30fps):

720p/h264: 3M(高清)2M(标清)1.3M(流畅)

720p/h265: 2M(高清)1.3M(标清)1M(流畅)

1080p/h264: 6M(高清)4M(标清)2.6M(流畅)

1080p/h265: 4M(高清)2.6M(标清)2M(流畅)

stream_width

number

出流帧宽度,默认为云手机分辨率规格宽度,设置范围[240, 云手机分辨率规格宽度]。

出流帧宽度需要为8的倍数,且宽高比需要与物理分辨率宽高比保持一致。

stream_height

number

出流帧高度,默认为云手机分辨率规格高度,设置范围[240, 云手机分辨率规格高度]。

出流帧高度且需要为8的倍数,且宽高比需要与物理分辨率宽高比保持一致。

rcmode

number

码率控制模式,默认为2。

0: ABR(平均码率)

1: CRF(画质优先)

2: CBR(恒定码率)

3: CAPPED_CRF(画质优先,但限制码率)

gop

number

视频编码GOP长度,默认为3000,设置范围[30, 5000]。

说明:当“encode_type”取值为“5”时,设置范围[30, 1024]。

profile

number

编码规格,默认为66(Baseline),可设置为77(Main), 100(High)。

客户端为手机屏幕,建议选择66。

客户端为电视大屏,建议选择77或100。

repeat_fps

number

补帧帧率,默认为0(不开补帧),设置范围[0,云手机规格的帧率]。

remote_scheduling_elb_ip

string

外置编码*调度资源池elb ip,默认为空,需配置为购买elb时分配的内网ip地址。

remote_scheduling_elb_port

number

外置编码*调度资源池elb端口,默认值为-1,需配置为购买elb时设置的port。

  • 外置编码是采用与云手机服务器同VPC下的ECS为云手机提供编码能力的技术方案,支持H.264/H.265硬件编码出流,不占用云手机资源,具有编码时延低、画质质量高的特点。
  • 具体接入及配置方法,详见:华为云手机编码池

输出参数

返回值

0:成功

小于0:视频服务初始化失败

错误码

请参见错误码

调用示例

json串的配置如下,参数可选,如果不设置,使用默认值: 
{ 
    "frame_type": "h264",  
    "remote_scheduling_elb_ip": "127.0.0.1",
    "remote_scheduling_elb_port": 10001
} 
调用示例: 
static void TestVideoCallback(uint8_t* buffer, uint32_t length, VideoCallbackExt &videoCallbackExt) 
{ 
    std::cout <<"video_Datasize = "<< length <<std::endl; 
    int orientation = (int)videoCallbackExt.orientation; 
    // orientation代表视频出流方向,需要根据此回调值对客户端进行适配
    // orientation=0:竖屏 
    // orientation=8:横屏,需要对回调后的视频内容做逆时针90度的旋转
    return;
} 

// 场景一:请求h264编码出流,采用默认AUTO模式
const char *jsonStr = "{\"frame_type\":\"h264\",\"remote_scheduling_elb_ip\":\"127.0.0.1\",\"remote_scheduling_elb_port\":10001}" ;
int ret = OpenVideo(jsonStr, TestVideoCallback);

// 场景二:请求h265编码出流,采用默认AUTO模式,并判断返回值错误码(错误码详情描述见文档第6部分)
// 如果没有外置编码资源则切换h264 AUTO模式出流
const char *jsonStr = "{\"frame_type\":\"h265\",\"remote_scheduling_elb_ip\":\"127.0.0.1\",\"remote_scheduling_elb_port\":10001}";
int ret = OpenVideo(jsonStr, TestVideoCallback);
if (ret == -3300) {
    jsonStr = "{\"frame_type\":\"h264\",\"remote_scheduling_elb_ip\":\"127.0.0.1\",\"remote_scheduling_elb_port\":10001}";
    int ret = OpenVideo(jsonStr, TestVideoCallback);
}

相关文档