云服务器内容精选

  • 检查播放端 在第三方播放器中输入播放地址进行播放,检查播放器是否存在问题,建议可以使用VLC播放器检测。 检查播放设备是否存在问题,建议可以换一个手机和PC进行检测。 检查播放器是否支持对应的格式。 以下为华为云 视频直播 播放器对直播流格式的支持情况: Web端播放器:支持的格式有M3U8和FLV。 移动端播放器:支持的格式有RTMP、FLV和M3U8。 若检查是播放器不支持导致,建议切换播放器播放。
  • 检查播放地址是否正确 您需要根据是否配置了Key防盗链的情况来拼接对应的原始播放地址和鉴权播放地址。若开启了Key防盗链加密鉴权,则需要使用鉴权后的播放地址,否则,请使用原始播放地址进行播放。 请您对照播放地址拼接规则,确认当前的播放地址是否正确,若不正确,请使用正确的地址进行播放。 原始播放地址支持FLV、M3U8、RTMP三种格式,对应的拼接规则如下所示: RTMP格式:rtmp://播放 域名 /AppName/StreamNameFLV格式:http://播放域名/AppName/StreamName.flvM3U8格式:http://播放域名/AppName/StreamName.m3u8 请您按照实际使用的AppName和StreamName拼接播放地址。 鉴权播放地址请参见播放Key防盗链拼接对应的播放地址。 播放地址中的AppName和StreamName必须与推流地址中的一致。
  • 检查CNAME是否生效 由于视频直播服务默认开启直播下行加速服务,即播放加速,若您未配置CNAME解析,将由于无法解析播放域名,导致播放失败。请您参照如下方法,验证播放CNAME是否配置成功。 登录视频直播控制台。 在左侧导航树中,选择“域名管理”。 在域名列表中,获取播放域名的CNAME。 图2 域名管理 打开Windows操作系统中的cmd程序,通过nslookup加速域名的方式进行查询。 若回显的是系统分配的CNAME域名,则表示已配置CNAME。否则,您需要参考CNAME配置完成配置。
  • 检查推流端 视频播放时出现卡顿,有一部分原因是由于直播推流时出现了卡顿影响了片源质量。其中,设备的配置、视频采集参数的设置、网络环境等因素都可能导致推流端出现卡顿。当推流端出现卡顿时,您可以参照如下几方面逐一排查问题。 设备配置 推流过程中会占用一定比例的CPU,硬件配置较差的低端设备,在推流过程中若整体CPU使用率超过80%以上,画面会出现不同程度的卡顿,花屏等现象,会影响到视频的采集,导致片源质量下降影响用户端的观看。您可以通过更换设备配置、系统版本等较高的设备,以保障推流端设备的稳定性尽量避免可能导致卡顿的因素产生。 推流开发工具配置 由于编码端设置的码率、帧率以及编码档位过高,且受硬件条件限制,会导致编码速度变慢,无法达到流畅播放的帧率要求。因此对于推流设备的使用,iOS版的移动端建议您使用硬编码,因为iOS系统和硬件设备统一性高,而且省电。而Android版的移动端因为机型复杂,CPU类型众多,支持程度不一,推荐4.3及以上版本使用硬编码。 视频采集参数配置 一般情况下,为保障视频的流畅度帧率会设置在每秒15帧以上,如果帧率低于每秒10帧,画面就会出现较明显的卡顿,如无特殊情况,尽量将视频帧率设置在每秒15-30帧之间。帧率超过每秒30帧后,人眼就无法识别出画面的效果,且帧率增加后视频传输的带宽成本也会上升,建议您合理设置视频的采集参数。 网络带宽大小 使用在线带宽测试检查推流端的上行网络带宽情况 ,一般建议上行带宽最好稳定在10M以上。 系统资源占用 检查后台是否运行了大量的程序,建议删除和停止正在运行的程序,空出资源。
  • 检查CNAME是否生效 视频直播服务默认开启直播上行加速服务,即推流加速。若您的推流域名未配置CNAME解析,则会由于无法解析推流域名,从而导致推流失败。请您参照如下步骤,验证推流域名的CNAME是否配置成功。 登录视频直播控制台。 在左侧导航树中,选择“域名管理”。 在域名列表中,获取推流域名的CNAME。 图2 域名管理 打开Windows操作系统中的cmd程序,通过nslookup加速域名的方式进行查询。 若回显的是系统分配的CNAME域名,则表示已配置CNAME。否则您需要参考CNAME配置完成配置。
  • 检查直播源站或直播CDN 若推流端和播放端的排查结果均正常,请检查源站和加速区域的设置是否正确,详情请参考如何选择直播源站和加速区域?。 若检查结果均正常,请提交工单联系技术客服排查直播源站或直播CDN是否存在问题。 提交工单时,需附上如下信息: 问题发生时间。 故障现象,并提供访问异常或慢的URL地址、直播推流或拉流地址。 故障节点信息,并提供Ping域名的返回结果图。 用户出口IP和出口DNS,示例如:http://dns-detect-portal.n.cdnhwc5.cn/?domain=xx.xx.xx。并提供相应的访问截图。
  • 检查推流地址是否正确 您需要根据是否配置了Key防盗链的情况来拼接对应的原始推流地址或鉴权推流地址。若开启了Key防盗链加密鉴权,则需要使用鉴权后的推流地址,否则,请使用原始推流地址进行推流。 请您对照推流地址拼接规则,确认当前的推流地址是否正确,若不正确,请使用正确的地址进行推流。 原始推流地址拼接规则如下: rtmp://推流域名/AppName/StreamName 请您按照实际使用的“AppName”和“StreamName”拼接推流地址。 华为云视频直播服务的推流协议暂只支持RTMP,推流地址必须以rtmp开头。 鉴权推流地址请参见推流鉴权进行拼接。
  • 原因3解决方法 播放域名和推流域名必须在同一Region的直播源站才能关联。如果不在相同Region,关联时会报错“配置参数region校验失败”。 登录视频直播控制台。 在左侧导航树中,选择“域名管理”,如图3所示。 在域名列表中,检查播放域名和推流域名的直播源站是否在同一Region,需同为“华北-北京四”或同为“亚太-新加坡”。 若是,则直播域名关联失败,非本原因导致。 若不是,需重新创建推流域名,且推流域名选择的“直播源站”所在Region必须与播放域名保持一致。 图3 域名管理
  • 原因2解决方法 若推流域名不是“云直播”类型,则关联推流域名时会失败,界面报错“不支持媒体直播域名”。 登录视频直播控制台。 在左侧导航树中,选择“域名管理”,如图2所示。 在域名列表中,检查推流域名的“子服务类型”是否为“云直播”。 若是,则直播域名关联失败,非本原因导致。 若不是,则推流域名的“子服务类型”是“媒体直播”。需重新创建域名,且推流域名的“子服务类型”必须选择“云直播”。 图2 域名管理
  • SDK概述 华为云提供了直播服务端SDK,您可以直接集成服务端SDK来调用直播的相关API,从而实现对直播服务的快速操作。目前视频直播提供了Java、Python、Go和PHP四种语言SDK供开发者使用,如表1所示。 SDK已知安全漏洞及修复版本、规避方案,请单击表1中的SDK对应语言的Github地址进行查看。 表1 服务端SDK 语言 Github地址 参考文档 JAVA huaweicloud-sdk-java-v3 Java SDK使用指导 Python huaweicloud-sdk-python-v3 Python SDK使用指导 Go huaweicloud-sdk-go-v3 Go SDK使用指导 PHP huaweicloud-sdk-php-v3 PHP SDK使用指导 支持的直播API如表2所示,后续SDK将会持续升级,支持所有直播API。 表2 SDK与API对应关系 Java SDK Python SDK Go SDK API参考 createDomain create_domain CreateDomain 创建直播域名 deleteDomain delete_domain DeleteDomain 删除直播域名 updateDomain update_domain UpdateDomain 修改直播域名 showDomain show_domain ShowDomain 查询直播域名 createDomainMapping create_domain_mapping CreateDomainMapping 域名映射 deleteDomainMapping delete_domain_mapping DeleteDomainMapping 删除直播域名映射关系 createTranscodingsTemplate create_transcodings_template CreateTranscodingsTemplate 创建直播转码模板 updateTranscodingsTemplate update_transcodings_template UpdateTranscodingsTemplate 修改直播转码模板 deleteTranscodingsTemplate delete_transcodings_template DeleteTranscodingsTemplate 删除直播转码模板 showTranscodingsTemplate show_transcodings_template ShowTranscodingsTemplate 查询直播转码模板 createStreamForbidden create_stream_forbidden CreateStreamForbidden 禁止直播推流 updateStreamForbidden update_stream_forbidden UpdateStreamForbidden 修改禁推属性 deleteStreamForbidden delete_stream_forbidden DeleteStreamForbidden 禁推恢复 listStreamForbidden list_stream_forbidden ListStreamForbidden 查询禁止直播推流列表 showBandwidth show_bandwidth ShowBandwidth 查询直播加速的带宽数据 listLiveSampleLogs list_live_sample_logs ListLiveSampleLogs 获取直播播放日志 createRecordRule create_record_rule CreateRecordRule 创建录制规则 listRecordRules list_record_rules ListRecordRules 查询录制规则列表 updateRecordRule update_record_rule UpdateRecordRule 修改录制规则 deleteRecordRule delete_record_rule DeleteRecordRule 删除录制规则 showRecordRule show_record_rule ShowRecordRule 查询录制规则配置 runRecord run_record RunRecord 提交录制控制命令 createRecordCallbackConfig create_record_callback_config CreateRecordCallbackConfig 创建录制回调配置 listRecordCallbackConfigs list_record_callback_configs ListRecordCallbackConfigs 查询录制回调配置列表 updateRecordCallbackConfig update_record_callback_config UpdateRecordCallbackConfig 修改录制回调配置 showRecordCallbackConfig show_record_callback_config ShowRecordCallbackConfig 查询录制回调配置 deleteRecordCallbackConfig delete_record_callback_config DeleteRecordCallbackConfig 删除录制回调配置 showTraffic show_traffic ShowTraffic 查询直播加速的流量数据 showOnlineUsers show_online_users ShowOnlineUsers 查询直播播放在线人数 listBandwidthDetail list_bandwidth_detail ListBandwidthDetail 查询播放带宽趋势接口 listDomainTrafficDetail list_domain_traffic_detail ListDomainTrafficDetail 查询播放流量趋势接口 listDomainBandwidthPeak list_domain_bandwidth_peak ListDomainBandwidthPeak 查询播放带宽峰值接口 listDomainTrafficSummary list_domain_traffic_summary ListDomainTrafficSummary 查询播放流量汇总接口 listUsersOfStream list_users_of_stream ListUsersOfStream 查询观众趋势接口 listQueryHttpCode list_query_http_code ListQueryHttpCode 查询直播拉流HTTP状态码接口 listTranscodeData list_transcode_data ListTranscodeData 查询转码用量接口 listRecordData list_record_data ListRecordData 查询录制用量接口 listSnapshotData list_snapshot_data ListSnapshotData 查询截图用量接口 showUpBandwidth show_up_bandwidth ShowUpBandwidth 查询上行带宽数据接口 showStreamCount show_stream_count ShowStreamCount 查询域名维度推流路数接口 listHistoryStreams list_history_streams ListHistoryStreams 查询历史推流列表接口 showStreamPortrait show_stream_portrait ShowStreamPortrait 查询播放画像信息接口 listSingleStreamFramerate list_single_stream_framerate ListSingleStreamFramerate 查询推流帧率数据接口 listSingleStreamBitrate list_single_stream_bitrate ListSingleStreamBitrate 查询推流码率数据接口 listLiveStreamsOnline list_live_streams_online ListLiveStreamsOnline 查询直播中的流信息
  • 安装SDK 视频直播服务端SDK支持PHP 5.6及以上版本。执行“ php --version”,检查当前PHP的版本信息。 推荐使用Composer安装SDK。 Composer是PHP的依赖管理工具,允许您在项目中声明依赖关系并安装这些依赖。 1234 # 安装 Composercurl -sS https://getcomposer.org/installer | php # 安装 PHP SDKcomposer require huaweicloud/huaweicloud-sdk-php 安装完毕后,您需要引入Composer的自动加载文件。 1 require 'path/to/vendor/autoload.php';
  • 安装SDK 视频直播服务端SDK支持python3及以上版本。执行“ python --version” 检查当前python的版本信息。 使用服务端SDK前,您需要安装“huaweicloudsdkcore ”和 “huaweicloudsdklive”,具体的SDK版本号请参见SDK开发中心。 使用pip安装 执行如下命令安装华为云Python SDK核心库以及相关服务库: 1234 # 安装核心库pip install huaweicloudsdkcore# 安装Live服务库pip install huaweicloudsdklive 使用源码安装 执行如下命令安装华为云Python SDK核心库以及相关服务库: 1234567 # 安装核心库cd huaweicloudsdkcore-${version}python setup.py install# 安装Live服务库cd huaweicloudsdklive-${version}python setup.py install
  • 代码示例 调用前请根据实际情况替换如下变量:{your endpoint string} 以及 {your project id}。 认证用的AK、SK直接写入代码,会有很大安全风险,建议密文形式存放在配置文件或者环境变量中,待使用时再解密,以确保安全。 本示例以AK、SK保存在环境变量中为例。运行本示例前,请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132333435 # coding: utf-8from huaweicloudsdkcore.auth.credentials import BasicCredentialsfrom huaweicloudsdkcore.exceptions import exceptionsfrom huaweicloudsdkcore.http.http_config import HttpConfigfrom huaweicloudsdklive.v1 import *def show_transcodings_template(client): try: request = huaweicloudsdklive.ShowTranscodingsTemplateRequest("play.example.huaweicloud.com") response = client.show_transcodings_template(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)if __name__ == "__main__": ak = os.environ["HUAWEICLOUD_SDK_AK"] sk = os.environ["HUAWEICLOUD_SDK_SK"] endpoint = "{your endpoint}" project_id = "{your project id}" config = HttpConfig.get_default_config() config.ignore_ssl_verification = True credentials = BasicCredentials(ak, sk, project_id) live_client = LiveAPIClient.new_builder(LiveAPIClient) \ .with_http_config(config) \ .with_credentials(credentials) \ .with_endpoint(endpoint) \ .build() show_transcodings_template(live_client)
  • 代码示例 调用前请根据实际情况替换如下变量:{your endpoint string} 和 {your project id}。 认证用的AK、SK直接写入代码,会有很大安全风险,建议密文形式存放在配置文件或者环境变量中,待使用时再解密,以确保安全。 本示例以AK、SK保存在环境变量中为例。运行本示例前,请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 package com.huaweicloud.sdk.test;// 用户身份认证import com.huaweicloud.sdk.core.auth.BasicCredentials;// 请求异常类import com.huaweicloud.sdk.core.exception.ClientRequestException;import com.huaweicloud.sdk.core.exception.ServerResponseException;// HTTP配置import com.huaweicloud.sdk.core.http.HttpConfig;// 导入直播服务的客户端import com.huaweicloud.sdk.live.v1.LiveClient;// 导入待请求接口的request和response类import com.huaweicloud.sdk.live.v1.model.ShowTranscodingsTemplateRequest;import com.huaweicloud.sdk.live.v1.model.ShowTranscodingsTemplateResponse;// 日志打印import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Application { private static final Logger logger = LoggerFactory.getLogger(Application.class); public static void showTranscodingsTemplate(LiveClient client) { try { // 初始化请求,以调用查询转码模板接口为例 ShowTranscodingsTemplateResponse showTranscodingsTemplateResponse = client.showTranscodingsTemplate( new ShowTranscodingsTemplateRequest().withDomain("play.example.huaweicloud.com") ); // 输出json格式的字符串响应 logger.info(showTranscodingsTemplateResponse.toString()); } catch (ClientRequestException e) { logger.error("HttpStatusCode: " + e.getHttpStatusCode()); logger.error("RequestId: " + e.getRequestId()); logger.error("ErrorCode: " + e.getErrorCode()); logger.error("ErrorMsg: " + e.getErrorMsg()); } } public static void main(String[] args) { String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); String endpoint = "{your endpoint string}"; String projectId = "{your project id}"; // 配置客户端属性 HttpConfig config = HttpConfig.getDefaultHttpConfig(); config.withIgnoreSSLVerification(true); // 创建认证 BasicCredentials auth = new BasicCredentials() .withAk(ak) .withSk(sk) .withProjectId(projectId); // 创建liveClient实例并初始化 LiveClient liveClient = LiveClient.newBuilder() .withHttpConfig(config) .withCredential(auth) .withRegion(region) .build(); showTranscodingsTemplate(liveClient); }}
  • 代码示例 调用前请根据实际情况替换如下变量:{your endpoint} 以及 {your project id}。 认证用的AK、SK直接写入代码,会有很大安全风险,建议密文形式存放在配置文件或者环境变量中,待使用时再解密,以确保安全。 本示例以AK、SK保存在环境变量中为例。运行本示例前,请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849 package mainimport ( "fmt" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/httphandler" live "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/live/v1" "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/live/v1/model" "net/http" "os")func RequestHandler(request http.Request) { fmt.Println(request)}func ResponseHandler(response http.Response) { fmt.Println(response)}func main() { client := live.NewLiveAPIClient( live.LiveAPIClientBuilder(). WithEndpoints([]string{"{your endpoint}"}). WithCredential( basic.NewCredentialsBuilder(). WithAk(os.Getenv("HUAWEICLOUD_SDK_AK")). WithSk(os.Getenv("HUAWEICLOUD_SDK_SK")). WithProjectId("{your project id}"). Build()). WithHttpConfig(config.DefaultHttpConfig(). WithIgnoreSSLVerification(true). WithHttpHandler(httphandler. NewHttpHandler(). AddRequestHandler(RequestHandler). AddResponseHandler(ResponseHandler))). Build()) request := &model.ShowTranscodingsTemplateRequest{ Domain: "play.example.huaweicloud.com", } response, err := client.ShowTranscodingsTemplate(request) if err == nil { fmt.Println("%+v\n",response) } else { fmt.Println(err) }}