直播服务开发指南 微吼云

服务介绍    

基本描述

直播服务依托于微吼多年的经验积累和强大的视频处理能力,将直播能力通过开放平台的形式开放给用户,为用户提供从接入到分发观看的一站式直播服务,保障用户体验到稳定流畅、低延时、高并发的直播效果,用户只需调用微吼云直播提供的 API & SDK 即可将视频服务无缝对接到自己的业务系统。

服务架构

主要功能

类别 功能名称 详细内容
直播接入 推流协议 支持RTMP协议推流
推流方式 支持微吼云提供的iOSAndroidJavascript推流SDK客户端,也支持常见的第三方如OBS/XSplit/FMLE等推流软件
推流设备 支持常见第三方RTMP推流硬件和编码器
直播观看 观看协议 支持RTMPFLVHLS三种播放协议
观看方式 支持微吼云提供的iOSAndroidJavascript播放 SDK
视频转码 支持720P480P360P、音频四种格式
房间管理 管理方式 支持管理控制台图形化管理、 API 管理
API 管理 创建房间、关闭房间、启用房间、删除房间、查询房间列表、查询正在推流列表、查询当前直播实时帧率质量、开启/关闭录制、开启/关闭转码
控制台管理 创建房间、关闭房间、启用房间、查询统计、直播预览、推流质量监控、开启/关闭录制、开启/关闭转码
数据统计 控制台统计 查询带宽、流量、观众访问数据
数据统计 API 统计 查询带宽、流量、观众访问数据

服务优势

1.视频转码

支持选择不同的码率进行转码,满足不同网络环境、不同终端设备下清晰、流畅的直播需求。

2.高并发

海量节点覆盖,支持多 CDN 智能调度,可支持百万级别并发直播观看。

3.视频录制

提供同步录制,录制视频直接对接点播平台。

4.直播间管理 API

提供直播房间的创建、关闭、启用、删除、查询等 API 功能,可无缝同自有视频内容管理系统整合集成。

5.支持多平台直播

提供多终端推流&播放器 SDK ,迅速接入直播服务,支持iOS/Android/Web等平台。

快速开始    

直播流程

微吼云直播流程图

直播前准备

1 前提条件

  • 推流与播放工具

    完成一次直播需要具备发起直播和观看直播的工具,微吼云提供 推流/播放器 SDK 及 体验 Demo ,可以通过 Demo 进行视频的推流与播放。

    1. 通过微吼云提供的下载页,下载安装 推流/播放器 SDK 及 Demo 。

    2. 移动端需要在一台手机上安装 推流 SDK 进行推流,另一台手机安装 播放器 SDK 进行拉流。

2 操作步骤

2.1 登录

登录微吼云控制台

2.2 创建应用

详情参考: 如何在微吼云控制台创建新的应用?

2.3 获取 app_id

详情参考:如何获取 应用ID( app_id )和 应用私钥(secret_key)?

2.4 设置包名和签名

如需集成移动端 SDK,则需设置包名和签名,详情参考: 如何设置应用的包名和签名?

2.5 添加直播服务

应用创建成功后,系统自动添加直播服务。

添加直播服务

2.6 获取推流地址、直播码

推流地址和直播码可分别通过控制台、API 接口和 API 在线测试工具三种方式进行获取。

2.6.1 控制台获取

  1. 服务开通成功后,会自动创建一个演示直播间,在控制台可获取演示直播间的推流地址、直播码

  2. 控制台页面中的直播服务点击直播管理,进入直播配置页面,您可在直播配置页面获取演示房间的推流地址信息(包含过期时间&推流地址&直播码)

    过期时间:默认为直播房间创建后的次日零点,可对过期时间进行修改

    直播码:对应直播房间ID room_id

    推流地址:系统依照默认过期时间生成一条推流地址。若对过期时间进行修改,过期时间修改完成后点击生成推流地址,依照规则生成新的推流地址

控制台获取

2.6.2 API接口查询

通过接口获取推流地址&直播码,具体参考获取推流信息接口

2.6.3 API在线测试工具获取

参考通过在线测试接口工具完成获取推流地址&直播码

2.7 获取 直播房间ID(room_id)

room_id 即为 直播房间ID ,以下简称 room_id ,用户可通过控制台查询 room_id,也可通过 API接口 和 API在线测试工具 进行查询。

2.7.1 控制台查询

在直播管理房间管理页面可查询直播间的 房间ID 字段即为 room_id,具体如下图

控制台查询

2.7.2 API接口查询

通过接口创建并获取 room_id,具体参考创建房间接口

2.7.3 API在线测试工具

通过API在线测试工具获取直播房间ID

2.8 获取 access_token

access_token 为 SDK 与 API接口交互时的权限令牌,初始化SDK时需要将获取到的 access_token 传入SDK,SDK在请求时会附带 access_token 字段。

: access_token过期时间,默认为一天,最大为一天,过期后需要重新生成access_token。

获取 access_token 具体方式可以参考以下两种方式获取:

2.8.1 接口获取

可通过接口获取 access_token ,具体参考生成access_token接口

2.8.2 API在线测试工具获取

参考通过在线测试接口工具完成获取 access_token

发起直播

发起直播可通过微吼云提供的 推流SDK (包含 iOSAndroidJS )或者第三方推流软件进行推流,以下分别以推流SDK Demo和 第三方推流软件为例进行说明。

JS SDK Demo

1 演示地址

https://static.vhallyun.com/jssdk/vhall-jssdk-live-stream/test/demo.html

2 接口配置

接口配置页面依次输入 app_id(应用ID)、room_id(直播房间ID)、accountId(第三方用户ID:开发者自有用户系统里用户的唯一标识),详情参考:第三方用户ID(third_party_user_id)是什么?、token(access_token),点击保存,跳转至推流页面。

推流设置

3 推流

进入推流页面点击设置按钮,弹出推流设置,设置信息包含摄像头、麦克风、分辨率和音量,不设置则使用系统默认值。

设置完成点击确定,设置成功,此时点击推流,即可发起直播。

*注:推流还可通过点击页面的推流演示,不进行接口设置,直接进入推流页面,完成设置后,点击推流,发起直播。

推流1

推流2 推流3

iOS SDK Demo

具体参考Demo使用指南

Andriod SDK Demo

具体参考Demo使用指南

第三方推流软件

使用第三方工具推流:可进入第三方工具推流教程查看详细操作。

观看直播

观看直播可通过微吼云提供的 播放器SDK (包含 iOSAndroidJS ),以下将分别说明其用法。

JS SDK Demo

1 演示地址

https://static.vhallyun.com/jssdk/vhall-jssdk-live/test/demo.html

2 接口配置

接口配置页面依次输入上述方法中获得的app_id(应用ID)、room_id(直播房间ID)、accountId(第三方用户ID:开发者自有用户系统里用户的唯一标识),详情参考:第三方用户ID(third_party_user_id)是什么?、token(access_token),点击保存,跳转至观看页面。

观看

3 观看直播

进入观看页面选择 PC直播 并点击播放即可进行直播观看。

注:观看还可通过点击页面的观看演示,不进行接口设置,直接进入观看页面。

PC直播

iOS SDK Demo

具体参考Demo使用指南

Andriod SDK Demo

具体参考Demo使用指南

控制台使用指南    

成为开发者

详情参考如何成为开发者

创建应用

详情参考如何创建应用

添加服务

应用创建成功后,系统自动添加直播服务。

添加直播服务

直播管理

点击直播服务的直播管理,进入直播管理页面,页面中包含直播配置、房间管理、带宽流量、统计分析、推流质量监控几部分,用户可分别通过这几个部分来对直播服务进行管理。

直播配置

直播配置包含应用信息、推流地址、直播录制、转码设置四部份。

应用信息

应用信息包含app_id、回调URL

app_id的含义,参考什么是app_id

回调URL:设置回调URL,填写完成,点击保存,回调URL设置成功。

推流地址

包含直播码、推流地址、观看地址、使用第三方推流工具教程四部分

首次创建应用后直播服务会自动创建一个演示房间,并对应生成直播码、推流地址和观看地址,在控制台默认显示演示直播房间的直播码和推流地址。后期可以通过API进行房间创建,创建房间后自动生成直播码和推流地址,具体参考创建房间接口。

直播码:对应直播房间ID

推流地址:默认过期时间为直播房间创建后的次日零点,可对过期时间进行修改,修改完成后点击生成推流地址,依照规则生成推流地址。

点击复制直接复制推流地址,同时还可点击二维码缩略图,通过二维码扫描获取推流地址,主要用于小程序。

观看地址:支持点击复制观看地址在浏览器中复制打开观看,或点击预览观看直播画面。

使用第三方工具推流:指导用户如何用第三方工具进行推流,可点击查看详细图文教程进行参考。

直播录制

控制台点击开关,可设置是否开启直播录制功能,录制后,用户可通过接口进行操作将录制下来的直播文件生成点播文件。故用户需在使用录制功能前,提前开通点播服务。

录制任务还可以通过API进行控制,具体操作参考配置直播开始录制接口。

规格说明:

录制视频针对直播原始码率录制,输出格式为HLS。

提醒:录制后的文件会在点播平台产生对应费用,请根据实际情况留意相关成本支出。

转码设置

点击配置,可选择需要转码的码率,支持720P、480P、360P、音频。

转码设置还可以通过API进行控制,具体操作参考配置直播转码接口。

规格说明:

720P:分辨率720P 码率650kb

480P:分辨率480P 码率450kb

360P:分辨率360P 码率330kb

音频:原始码率,输出格式为AAC

提醒:开启转码后会产生对应费用,请根据实际情况留意相关成本支出。

房间管理

房间管理支持对直播房间进行查询、启用、关闭和直播预览操作。

查询:支持通过房间ID进行查询。

启用:已关闭的房间,点击启用,房间启用,可恢复推流。

关闭:已启用的房间,点击关闭,房间关闭,将无法进行推流。

直播预览:有直播流的情况,点击直播预览,可以预览当前直播流的画面,观看直播效果。

获取地址:点击获取地址,弹出直播间推流地址的弹窗,可通过复制或者二维码扫描的方,二维码扫描主要用于小程序的场景。

带宽流量

支持用户在指定时间范围内对带宽、流量信息进行数据查询,数据颗粒度为1个小时。

统计分析

支持用户在指定时间范围内对观众人数、观看次数、观众的地理位置分布、观看终端分布、观看浏览器分布信息进行查询,数据颗粒度为1个小时。

推流质量监控

可以查看每个房间直播流的分辨率、实推码率/帧率、推流时长、推流设备、帧率质量信息,并可点击预览按钮预览直播画面。

客户端集成

客户端SDK下载:

SDK下载

客户端SDK集成文档:

iOS SDK如何发起直播

Android SDK如何发起直播

JS SDK如何发起直播

iOS SDK如何观看直播

Android SDK如何观看直播

JS SDK如何观看直播

服务端集成

如何通过接口完成直播准备

服务端API手册

直播API    

API名称 功能
create 创建房间
disable 封停房间
enable 解封房间
delete 删除房间
lists 房间列表
get-push-info 获取推流信息
set-trans-code-info 配置直播转码
set-record-info 配置开始直播录制
get-stream-flow 获取直播流量数据
get-stream-board-band 获取直播宽带数据
get-stream-msg 获取直播流信息
get-pushing-stream-list 获取正在推流的房间列表
get-room-use-info 获取直播属性信息
get-room-join-info描述 获取直播访问记录

如何通过接口完成直播准备    

通过接口测试工具完成    

本文将引导通过接口测试工具,创建直播 room_id 和具有推流权限的 access_token

进入接口测试页面

为使 SDK 可以在无需服务端代码即可运行,微吼云提供了 API 请求工具为 SDK 完成准备工作。 点击这里 进入 API 请求工具页面。

创建房间

通过接口创建房间、获取房间 ID

  • 选择服务 : Room ,API 名称 : create
  • 创建房间接口文档 填写参数
  • 返回数据中 room_id 即为 SDK 发起直播需要的 room_id

如下图 :

生成 access_token

通过接口获取具有推流权限的 access_token

  • 选择服务 : Base , API 名称 :create-access-token
  • 生成 access_token 接口文档 填写参数
  • 返回数据中的字段 access_token 即为 SDK 发起直播需要的 access_token

如下图 :

参考链接

完成本页的步骤后,您可能需要阅读以下文档。

通过服务端代码完成    

本文将引导通过服务器端代码请求微吼云 API,创建直播 room_id 和具有推流权限的 access_token

获取 app_id 和 secret_key

微吼云 API 使用 app_id 来标识应用,使用 secret_key 来作为双方通讯的传输秘钥,两者为使用微吼云 API 的必要参数。

点击这里 查看如何获取 app_idsecret_key

PHP代码实现

引入公共代码

我们对调用 API 过程中一些公用代码做了简单封装,作为工具库,您可以 点击这里 获取。然后在代码中引用。

/**
 * 引入公共代码
 */
include_once("vhall_paas.php");

本文后面的 PHP 示例代码将以此工具库为基础。

运行服务端代码

当微吼云代码工具库引入到项目中后,您可以开始运行下列 API 调用代码来获取直播 room_id 和有推流权限的 access_token

获取直播 room_id

// 引入公共代码
include 'vhall_paas.php';

/**
 * 初始化应用&秘钥信息
 * 获取方式 微吼云控制台 -> 应用 -> 设置 -> 应用信息
 * http://www.vhallyun.com/console/app/index
 */
VhallPaas::$app_id = '';
VhallPaas::$secret_key = '';

// 创建房间接口请求地址
$createRoomAddress = 'api.yun.vhall.com/api/v1/room/create';

// 创建房间参数
$createRoomParams = [];

// 加载公共参数&运算签名
$createRoomParams = VhallPaas::createRealParam($createRoomParams);

// 创建房间
try {
    $result = VhallPaas::request($createRoomAddress, $createRoomParams);
    $roomId = $result['room_id'];
} catch (Exception $e) {
    exit("请求发生错误 错误信息为 {$e->getMessage()} . 错误码为 {$e->getCode()}");
}

var_dump($roomId);

获取具有推流权限的 access_token

注意 :运行下面代码,需要您先获取到直播 room_id , 详情见上一步。

// 引入公共代码
include 'vhall_paas.php';

/**
 * 初始化应用&秘钥信息
 * 获取方式 微吼云控制台 -> 应用 -> 设置 -> 应用信息
 * http://www.vhallyun.com/console/app/index
 */
VhallPaas::$app_id = '';
VhallPaas::$secret_key = '';
// 生成AccessToken接口请求地址
$accessTokenAddress = 'api.yun.vhall.com/api/v1/base/create-access-token';

/**
 * 生成 AccessToken 参数
 * AccessToken 为 SDK 中鉴别用户权限使用,针对不同的服务需要不同的参数来生成 AccessToken
 * 当前例子需要推流权限,所以权限位使用的 publish_stream
 * 您可以通过阅读 www.vhallyun.com/docs/show/1013 来获取不同权限的 AccessToken 生成方式
 */
$createAccessTokenParams = [
    // 第三放用户ID,根据实际情况编写 (这里使用当前时间)
    'third_party_user_id' => 'vhall_paas_test_' . time(),
    // 过期时间,最大时间为一天,默认一天 (这里使用10小时做例子)
    'expire_time' => date("Y-m-d H:i:s", time() + (10 * 3600)),
    // 权限设定 (直播 room_id 通过上一步 获取直播 room_id 得到)
    'publish_stream' => ‘lss_xxxx’,
];

// 加载公共参数&运算签名
$createAccessTokenParams = VhallPaas::createRealParam($createAccessTokenParams);

// 获取 AccessToken
try {
    $result = VhallPaas::request($accessTokenAddress, $createAccessTokenParams);
    $accessToken = $result['access_token'];
} catch (Exception $e) {
    exit("请求发生错误 错误信息为 {$e->getMessage()} . 错误码为 {$e->getCode()}");
}

var_dump($accessToken);

参考链接

完成本页的步骤后,您可能需要阅读以下文档。

如何通过 SDK 发起直播    

iOS SDK 如何发起直播    

推流准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 设置应用Bundle ID

  4. 获取roomId

  5. 获取直播间包含推流权限的access_token

    可以通过 【测试工具】 或 【API】 获得

工程配置

在开始使用sdk之前,我们要配置好IDE和创建基础的工程代码。相关内容在【工程配置】中有详细说明。

注意:发起直播只能在真机环境下运行

时序图

注:已知直播间ID的情况下虚线框部分无需请求。

代码对接

1: 引入推流头文件

#import "VHLivePublisher.h"

2: 创建Publisher对象

先创建一个 Publisher 对象,我们后面主要用它来完成推流工作。

不过在创建 Publisher 对象之前,还需要您指定一个 VHPublishConfig 对象,该对象的用途是决定 Publisher 推流时各个环节的配置参数,比如推流用多大的分辨率、每秒钟要多少帧画面(FPS)等等,具体配置参数移步【VHPublishConfig 参数说明】。

VHPublishConfig 在 configWithType 之后便已经装配了一些我们反复调过的参数,如果您不需要自己定制这些配置,塞给Publisher对象就可以了。如果您有相关领域的经验基础,需要对这些默认配置进行调整。

// 创建 LivePushConfig 对象,该对象默认初始化为基础配置
VHPublishConfig* config = [VHPublishConfig configWithType:VHPublishConfigTypeDefault];
//在 config中您可以对推流的参数(如:前后置摄像头、分辨率、帧率,横竖屏推流等)做一些初始化操作,需要注意 config不能为nil
_publisher = [[VHLivePublisher alloc] initWithConfig: config];

3: 设置并启动预览画面、delegate

  • delegate 推流事件代理
  • startCapture 启动手机摄像头采集画面,并将画面渲染到屏幕上。
_publisher.delegate            = self;
_publisher.preView.frame = self.view.bounds;
[self.view insertSubview:_publisher.preView atIndex:0];
    //开始视频采集、并显示预览界面
[_publisher startCapture];

4: 开始推流

经过 step1 和 step2 的准备之后,用下面这段代码就可以启动推流了:

roomId 和 accessToken 参考页首推流准备

NSString* roomId = @"lss_xxxxxx";
NSString* accessToken = @"xxxxxxxxxx";
[_publisher startPublish:roomId accessToken:accessToken];

5: 切换前置或后置摄像头

默认是使用后置摄像头(可以通过修改 VHPublishConfig 的配置项 captureDevicePosition 来修改这个默认值),调用一次switchCamera 切换一次,注意切换摄像头前必须保证 VHPublishConfig 和 VHLivePublisher 对象都已经初始化。

// 默认是前置摄像头,可以通过修改 LivePushConfig 的配置项 frontCamera 来修改这个默认值
[_publisher switchCamera:AVCaptureDevicePositionBack];//AVCaptureDevicePositionFront

6: 打开或关闭闪光灯

只有后置摄像头才可以打开闪光灯,另外该接口需要在启动预览之后调用

// 默认是前置摄像头,可以通过修改 LivePushConfig 的配置项 frontCamera 来修改这个默认值
if(!frontCamera) {
    BOOL bEnable = YES;
    //bEnable为YES,打开闪光灯; bEnable为NO,关闭闪光灯
    BOOL result = [_publisher torchMode: bEnable];
    //result为YES,打开成功;result为NO,打开失败
}

7: 手动对焦

对焦点 [x,y] 取值范围[0.0 - 1.0]

// 手动对焦 point 对焦点 [x,y] [0.0 - 1.0]
 - (BOOL)focusCameraAtAdjustedPoint:(CGPoint)point;

8: 变焦

变焦取值范围[1.0 - xx] xx 是系统相机支持最大变焦值

//变焦
 - (BOOL)zoomCamera:(CGFloat)zoomSize;

9: APP 切入后台

常规模式下,App一旦切到后台,摄像头的采集能力就会被 iOS 暂时停止掉,这就意味着 SDK 不能再继续采集并编码出音视频数据。

a. 注册切入后台通知

//先注册后退消息通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleEnterBackground:) 
    name:UIApplicationDidEnterBackgroundNotification object:nil];

b. 切后台处理

//收到通知后,调用beginBackgroundTaskWithExpirationHandler
 - (void)handleEnterBackground:(NSNotification *)notification
{
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    }];
    [_publisher pause];
}

c. 切前台处理

//切前台处理
 - (void)handleEnterForeground:(NSNotification *)notification
{
    [_publisher resume];
}

10: 停止推流

结束推流很简单,不过要做好清理工作,因为用于推流的 VHLivePublisher是不能多实例并行运转的,所以清理工作不当会导致下次直播遭受不良的影响。

//停止推流
 - (void)stopRtmpPublish {
    [_publisher stopPublish];
    _publisher.delegate = nil;
}

11: 停止采集

停止音视频采集,并关闭预览画面

[_publisher stopCapture];//停止采集

12: 销毁publisher

销毁初始化数据,同步销毁,如果感觉销毁太慢,可以开线程去销毁

[_publisher destoryObject];

事件处理

  • 推流状态监听 SDK 通过 VHLivePublisherDelegate 代理来监听推流相关的事件

采集到第一帧画面回调

/**
 *  采集到第一帧的回调
 *  @param image 第一帧的图片
 */
-(void)firstCaptureImage:(UIImage*)image;

推流状态回调

/**
 *  推流状态回调
 *  @param status   状态类型
 *  @param info     状态信息
 */
- (void)onPublishStatus:(VHPublishStatus)status info:(NSDictionary*)info;
事件ID 数值 含义说明
VHPublishStatusPushConnectSucceed 1 直播连接成功
VHPublishStatusUploadSpeed 2 直播上传速率
VHPublishStatusUploadNetworkException 3 发起端网络环境差
VHPublishStatusUploadNetworkOK 4 发起端网络环境恢复正常

错误回调

/**
 *  错误回调
 *  @param error    错误类型
 *  @param info     错误信息
 */
- (void)onPublishError:(VHPublishError)error info:(NSDictionary*)info;//@{code:"" ,content: ""}
错误类型 数值 含义说明
VHPublishErrorPusherError 1 推流相关错误@{code:"10001" ,content: "xxxxx"}
VHPublishErrorAuthError 2 验证等相关错误
VHPublishErrorParamError 3 参数相关错误
VHPublishErrorCaptureError 4 采集相关错误

快速集成代码

可以把推流端代码写到 ViewController.m 的 viewDidLoad 方法中测试推流,但是要在真机环境下运行,代码如下:

//
//  ViewController.m
//  TestProject
//
//  Created by vhall on 2018/3/12.
//  Copyright © 2018年 vhall. All rights reserved.
//

#import "ViewController.h"

#import "VHLivePublisher.h"

@interface ViewController ()<VHLivePublisherDelegate>
@property (nonatomic,strong)VHLivePublisher *publisher;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 创建 LivePushConfig 对象,该对象默认初始化为基础配置
    VHPublishConfig* config = [VHPublishConfig configWithType:VHPublishConfigTypeDefault];
    //在 config中您可以对推流的参数(如:前后置摄像头、分辨率、帧率,横竖屏推流等)做一些初始化操作,需要注意 config不能为nil
    _publisher = [[VHLivePublisher alloc] initWithConfig: config];
    //设置代理
    _publisher.delegate            = self;
    //设置预览界面位置
    _publisher.preView.frame = self.view.bounds;
    //把预览界面加入页面中
    [self.view insertSubview:_publisher.preView atIndex:0];
    //开始视频采集、并显示预览界面
    [_publisher startCapture];
    
    //开始推流
    NSString* roomId        = @"lss_xxxxxx";//roomId 获得方式 参考页面开始处
    NSString* accessToken   = @"xxxxxxxxxx";//accessToken 获得方式 参考页面开始处
    [_publisher startPublish:roomId accessToken:accessToken];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)viewDidLayoutSubviews
{
    //更新览界面位置
    _publisher.preView.frame = self.view.bounds;

}

#pragma mark - VHLivePublisherDelegate
/**
 *  采集到第一帧的回调
 *  @param image 第一帧的图片
 */
-(void)firstCaptureImage:(UIImage*)image
{
}

/**
 *  推流状态回调
 *  @param status   状态类型
 *  @param info     状态信息
 */
- (void)onPublishStatus:(VHPublishStatus)status info:(NSDictionary*)info
{
    NSLog(@"%ld %@",(long)status,info[@"content"] );
}

/**
 *  错误回调
 *  @param error    错误类型
 *  @param info     错误信息
 */
- (void)onPublishError:(VHPublishError)error info:(NSDictionary*)info//@{code:"" ,content: ""}
{
    NSLog(@"错误:%ld %@",(long)error,info[@"content"] );
}
@end

其他相关文档

  1. 快速开始
  2. 如何集成观看直播
  3. 发起直播参考手册
  4. VHPublishConfig

Android SDK 如何发起直播    

推流准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 设置应用包名、签名

  4. 创建直播间 获取roomId

    可以通过 【测试工具】 或 【API】 获得

  5. 获取直播间包含推流权限的access_token

    可以通过 【测试工具】 或 【API】 获得

工程配置

在开始使用sdk之前,我们要配置好IDE和创建基础的工程代码。相关内容在【工程配置】中有详细说明。

LSS And VOD

时序图

注:已知直播间ID的情况下虚线框部分无需请求。

代码对接

1 VHLivePusher

1.1 VHLivePushConfig 参数类

VHLivePushConfig是推流功能的配置类,也是推流的核心类之一,这个类决定了你推流时一些必备的参数,如视频流的宽高、帧率、码率、编码类型、推流类型等。传递一个分辨率并创建VHLivePushConfig类 。 分辨率定义如下:

推流分辨率定义 描述
VHLivePushFormat.PUSH_MODE_SD 低清分辨率 352 * 288
VHLivePushFormat.PUSH_MODE_HD 普清分辨率 640 * 480
VHLivePushFormat.PUSH_MODE_XHD 高清分辨率 960 * 540
VHLivePushFormat.PUSH_MODE_XXHD 超清分辨率 1280 * 720
/**
 * 初始化配置类
 * 其中有很多参数有默认项配置。
 */
config = new VHLivePushConfig(VHLivePushFormat.PUSH_MODE_HD);
/**
 * 竖屏发起
 */
config.screenOri = VHLivePushFormat.SCREEN_ORI_PORTRAIT

VHLivePushConfig 参数配置 以下是VHLivePushConfig的默认配置,如果需要修改,只需要调用相应的参数重新赋值即可

VHLivePushConfig参数 默认值 描述
screenOri VHLivePushFormat.SCREEN_ORI_LANDSPACE 推流横竖屏,默认横屏
videoFrameRate 15 视频帧率
videoBitrate 400 * 1000 视频码率
pushTimeout 5 * 1000 推流超时
pushReconnectTimes 5 推流重连次数
encodeColorFormat VHLivePushFormat.ENCODE_COLOR_FORMAT_YUV420SP_NV21 采集的颜色空间
streamMode VHLivePushFormat.STREAM_MODE_RTMP 推流协议
encodeType VHLivePushFormat.ENCODE_TYPE_SOFT 编码方式

1.2 初始化音视频采集器

VHVideoCaptureView 是SDK提供的一个视频采集View,VHVideoCaptureView主要操作Camera,完成推流的采集工作和对摄像头的Api调用。需要先在XML中引用View,听过FindView获取采集器的实例。VHAudioCapture 是SDK提供的音频采集类,直接初始化调用

/**
 * 初始化视频采集器
 */
videoCapture = (VHVideoCaptureView) this.findViewById(R.id.videoCaptureView);
/**
 * 视频采集器的XML
 */
<com.vhall.lss.push.VHVideoCaptureView
        android:id="@+id/videoCaptureView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</com.vhall.lss.push.VHVideoCaptureView>
/**
 * 初始化音频采集器
 */
audioCapture = new VHAudioCapture();

1.3 初始化VHLivePusher

VHLivePusher 是发起推流的核心对象,创建时传递的参数是,视频采集器,音频采集器和VHLivePushConfig,其实就是将1.1到1.3创建对象的实例传入进去。添加监听也在此时配置,监听的描述请看,到这里初始化的操作就完成了

/**
 * 初始化直播器
 * @param IVHCapture videoCapture 视频采集器
 * @param IVHCapture audioCapture 音频采集器
 * @param VHLivePushConfig config 直播参数配置项
 */
VHLivePusher pusher = new VHLivePusher(videoCapture, audioCapture, config);

/**
 * 添加监听事件
 * 具体参考本文的事件监听
 * @ VHPushLiveListener 需要实现的回调
 */
pusher.addListener(new MyListener());

当初始化工作完成后,就可以调用API的功能了

2: 开始推流

当一切就绪时,调用start()开始推流,此方法需要传入房间号roomId和有效的Token,这些参数在调用Api前获取,调用Start()后,如果想要了解推流的状态可以从监听中获取


 /**
 * 初始化直播器成功后调用此方法发起直播
 * 开始直播,传递在准备工作中配置的roomId(房间ID)和AccessToken;
 * @param String roomId; // 房间ID , 通过调用 api 创建
 * @param String accessToken; // 发起的Token  通过调用 api 创建
 */
pubic void start(String roomId ,String accessToken);

3: 切换前置或后置摄像头

顺序切换下一个摄像头,返回摄像头ID , 默认使用后置摄像头(注意 一定要将摄像头的权限打开)

/**
 * 切换摄像头
 * 此方法属于视频采集器 VHVideoCaptureView
 * @return int cameraID 返回摄像头ID
 */
pubic int switchCamera();

4: 打开指定哪个摄像头

返回摄像头ID (注意 一定要将摄像头的权限打开)

/**
 * 打开指定的摄像头
 * 此方法属于视频采集器 VHVideoCaptureView
 */
pubic int changeCamera(int cameraId);

5: 切换闪光灯

切换闪光灯 , 只有在后置的摄像头才能打开闪光灯

/**
 * 切换闪光灯
 * 此方法属于视频采集器 VHVideoCaptureView
 * @param boolean isOpen; //是否打开闪光灯
 */
pubic boolean changeFlash(boolean flash);

6: 获取当前直播状态

获取直播时的状态,也可以根据监听获取状态

状态 描述
IDEL 闲置状态 ,默认状态
STARTED 运行状态
STOPED 停止状态
END 结束状态
/**
 * 获取直播的状态
 * 此方法属于直播器 VHLivePusher
 */
pubic Status getStatus();
enum Status {
	IDEL,STARTED, STOPED, END
}

7: 暂停直播 / 恢复直播

调用后推流会暂停,采集工作也会停止,根据应用场景调用 ,调用后推流重新连接,采集工作重新开始,根据应用场景调用

/**
 * 暂停直播 / 恢复直播
 * 此方法属于直播器 VHLivePusher
 */
pubic void pause();
pubic void resume();

8: 设置摄像头变焦

/**
 * 个别手机支不支持摄像头变焦。
 * 此方法属于视频采集器 VHVideoCaptureView
 * @param int level (0~100)
 */
pubic void setZoom(int level);

9: 设置view内手势是否可用

videoCaptureView内部实现了手势聚焦和变焦,如果不需要手势,可设置false,自行调用focus和zoom接口

/**
 * 设置手势是否可用
 * 此方法属于视频采集器 VHVideoCaptureView
 */
pubic void setGestureEnable(boolean enable);

10: 设置摄像头预览模式

可通过 setCameraDrawMode(int mode) 接口来设置画面预览模式,具体的模式参考下列表格

预览模式 参数
VHLivePushFormat.DRAW_MODE_ASPECTFILL 将图像等比例铺满整个屏幕,多余部分裁剪掉,此模式下画面不会留黑边,但可能因为部分区域被裁剪而显示不全
VHLivePushFormat.DRAW_MODE_ASPECTFIT 将图像等比例缩放,适配最长边,缩放后的宽和高都不会超过显示区域,居中显示,画面可能会留有黑边
VHLivePushFormat.DRAW_MODE_NONE 默认
``
/**
 * 摄像头预览模式
 * 此方法属于视频采集器 VHVideoCaptureView
 */
pubic void setCameraDrawMode(int mode);

11: 结束直播

当调用stop()方法时,内部的请求地址会置空,当重新发起推流会重新获取推流地址

/**
 * 结束直播
 * 此方法属于视频采集器 VHVideoCaptureView
 */
pubic void stop();

12:销毁

退出播放并释放相关资源 , 此方法会销毁当前已经初始化的视频采集器和音频采集器,如果需要再次使用需要重新初始化直播器

/**
 * 退出播放并释放相关资源。
 * 此方法属于视频采集器 VHVideoCaptureView
 */
pubic void release();

事件处理

在构建推流器的时候添加监听,用户根据监听回调的事件可以进行相应的处理,详细信息请查看Demo ,此处只做简单描述

错误码 描述
VHLivePusher.ERROR_PUSH 推送过程出错
VHLivePusher.ERROR_AUDIO_CAPTURE 音频采集过程出错
VHLivePusher.ERROR_VIDEO_CAPTURE 视频采集过程出错
直播事件 描述
VHLivePusher.EVENT_STATUS_STARTING 开始推流
VHLivePusher.EVENT_STATUS_STARTED 推流成功
VHLivePusher.EVENT_STATUS_STOPED 推流停止
VHLivePusher.EVENT_UPLOAD_SPEED 下载速度
class MyListener implements VHPushLiveListener {
        @Override
        public void onError(int errorCode, int innerErrorCode) {
            switch (errorCode) {
                case VHLivePusher.ERROR_PUSH://推送过程出错
                    break;
                case VHLivePusher.ERROR_AUDIO_CAPTURE://音频采集过程出错
                    break;
                case VHLivePusher.ERROR_VIDEO_CAPTURE://视频采集过程出错
                    break;
            }
        }

        @Override
        public void onEvent(int eventCode, String eventMsg) {
            switch (eventCode) {
                case VHLivePusher.EVENT_STATUS_STARTING:
                    break;
                case VHLivePusher.EVENT_STATUS_STARTED:
                    break;
                case VHLivePusher.EVENT_STATUS_STOPED:
                    break;
                case VHLivePusher.EVENT_UPLOAD_SPEED:
                    break;
            }
        }
    }

滤镜美颜直播

第一步 创建美颜滤镜 VHBeautyFilter
第二步 设置给VHVideoCaptureView
第三步 设置美颜等级

    if (beautyFilter == null)
        beautyFilter = new VHBeautyFilter();
    videoCapture.setFilter(beautyFilter);
	<!- 设置美颜滤镜的等级 ->
	beautyFilter.setBeautyLevel(level) (1~5)
	
	<!--关闭滤镜-->
	videoCapture.setFilter(null);

Demo示例:

public class PushActivity extends Activity {

    VHVideoCaptureView videoCapture;
    IVHCapture audioCapture;
    VHLivePusher pusher;
    VHLivePushConfig config;
    //status info
    boolean isFlashOpen = false;
    int mCameraId = 0;
    boolean isAudioEnable = true;
    boolean isPushing = false;
    int mDrawMode = VHLivePushFormat.DRAW_MODE_NONE;
    //view
    TextView mSpeedView;
    ProgressBar mLoadingView;
    ImageView mPushBtn;

    private String roomId = "";
    private String accessToken = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        roomId = getIntent().getStringExtra("roomid");
        accessToken =getIntent().getStringExtra("token");
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.push_layout);
        //initview
        mSpeedView = (TextView) this.findViewById(R.id.tv_speed);
        mLoadingView = (ProgressBar) this.findViewById(R.id.pb_loading);
        mPushBtn = (ImageView) this.findViewById(R.id.btn_push);
        //配置发直播系列参数
        config = new VHLivePushConfig(VHLivePushFormat.PUSH_MODE_HD);
        config.screenOri = VHLivePushFormat.SCREEN_ORI_PORTRAIT;//横竖屏设置 重要
        //初始化音视频采集器
        videoCapture = (VHVideoCaptureView) this.findViewById(R.id.videoCaptureView);
        audioCapture = new VHAudioCapture();
        //初始化直播器
        pusher = new VHLivePusher(videoCapture, audioCapture, config);
        pusher.addListener(new MyListener());
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (pusher.getStatus() == IVHLivePusher.Status.STARTED) {
            pusher.pause();
            mPushBtn.setImageResource(R.mipmap.icon_start_bro);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (pusher.resumeAble())
            pusher.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        pusher.release();
    }

    public void push(View view) {
        if (isPushing) {
            pusher.stop();
            mPushBtn.setImageResource(R.mipmap.icon_start_bro);
        } else {
            if (pusher.resumeAble())
                pusher.resume();
            else
                pusher.start(roomId, accessToken);
            mPushBtn.setImageResource(R.mipmap.icon_pause_bro);
        }

    }

    public void changeFlash(View view) {
        isFlashOpen = videoCapture.changeFlash(!isFlashOpen);
    }

    public void changeCamera(View view) {
        mCameraId = videoCapture.switchCamera();
    }

    public void changeFilter(View view) {
        int level = (++mBeautyLevel) % 6;
        if (level == 0)
            videoCapture.setFilter(null);
        else {
            videoCapture.setFilter(new VHBeautyFilter());
            videoCapture.setBeautyLevel(level);
        }
        Toast.makeText(this, "level:" + level, Toast.LENGTH_SHORT).show();
    }

    public void switchAudio(View view) {
        isAudioEnable = audioCapture.setEnable(!isAudioEnable);
    }

    public void changeMode(View view) {
        switch (mDrawMode) {
            case VHLivePushFormat.DRAW_MODE_NONE:
                mDrawMode = VHLivePushFormat.DRAW_MODE_ASPECTFILL;
                break;
            case VHLivePushFormat.DRAW_MODE_ASPECTFILL:
                mDrawMode = VHLivePushFormat.DRAW_MODE_ASPECTFIT;
                break;
            case VHLivePushFormat.DRAW_MODE_ASPECTFIT:
                mDrawMode = VHLivePushFormat.DRAW_MODE_NONE;
                break;
        }
        videoCapture.setCameraDrawMode(mDrawMode);
    }

    class MyListener implements VHPushLiveListener {

        @Override
        public void onError(int errorCode, int innerErrorCode) {
            mLoadingView.setVisibility(View.GONE);
            switch (errorCode) {
                case VHLivePusher.ERROR_PUSH://推送过程出错
                    break;
                case VHLivePusher.ERROR_AUDIO_CAPTURE://音频采集过程出错
                    break;
                case VHLivePusher.ERROR_VIDEO_CAPTURE://视频采集过程出错
                    break;
            }
            Toast.makeText(PushActivity.this, "push error,errorCode:" + errorCode + ",innerCode:" + innerErrorCode, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onEvent(int eventCode, String eventMsg) {
            switch (eventCode) {
                case VHLivePusher.EVENT_STATUS_STARTING:
                    mLoadingView.setVisibility(View.VISIBLE);
                    break;
                case VHLivePusher.EVENT_STATUS_STARTED:
                    mLoadingView.setVisibility(View.GONE);
                    isPushing = true;
                    break;
                case VHLivePusher.EVENT_STATUS_STOPED:
                    mLoadingView.setVisibility(View.GONE);
                    isPushing = false;
                    break;
                case VHLivePusher.EVENT_UPLOAD_SPEED:
                    mSpeedView.setText(eventMsg + "kbps");
                    break;
            }
        }
    }
}

其他相关文档

  1. 快速开始
  2. 如何集成观看直播
  3. 发起直播参考手册

JS SDK 如何发起直播    

使用微吼云JS SDK,只需简单几步,就能快速发起直播。

跟随本文的步骤,即使你对Javascript语言不熟悉,也完全可以做到。

其中,一至三步为准备工作,第四步为代码接入,下面,就分步来说明。

一.推流准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 创建直播间 获取roomId

    可以通过 【测试工具】 或 【API】 获得

  4. 获取直播间包含推流权限的access_token

    可以通过 【测试工具】 或 【API】 获得

时序图

注:已知直播间ID的情况下虚线框部分无需请求。

二.引入sdk文件

接下来,我们正式接入sdk: 将下面sdk引入代码,插入页面的head标签里。

<script src="https://static.vhallyun.com/jssdk/vhall-jssdk-live-stream-1.0.0.js"></script>
<script src="https://static.vhallyun.com/jssdk/vhall-jssdk-base-1.0.0.js"></script>

注意:

1.直接用本地网页(file协议,地址栏以file:///开头)是调试不了的,需要运行在服务器上,且推流需https环境,(地址栏以https:// 开头)才能正常调试。

2.上面两个文件都需要引用,而且顺序需要保持与上面一致。

3.建议直接复制上面代码。

三.引入推流依赖flash文件

点此下载推流依赖flash文件,文件名为:Shy.swf。

下载后,在当前推流页同级目录建images文件夹,将下载的 Shy.swf文件放入images中。保证相对目录./images/Shy.swf文件能被推流页面访问到。

四.代码对接

至此,你已完成所有推流准备工作,距离你看到自己的推流画面,只差以下4步:

1.创建推流器对象

在页面加入推流器容器,也就是放一个div,然后给它取个名字,比如: my-publisher 。之后推流回显画面都会在这个容器里渲染,示例:

<div id="my-publisher"></div>

2.注册ready事件

接下来,在页面里写javascript代码,调用sdk提供的接口,注册sdk ready事件,接口调用方法如下:

 /**
  *  注册ready事件
  */
  Vhall.ready(function(){
    //TODO
  })

注意:所有推流相关逻辑需要写在此事件里。

3.初始化SDK配置

接下来,在Vhall.ready事件之后,进行初始化配置:

 /**
  *  注册ready事件
  */
  Vhall.ready(function(){
    //TODO
  });
  
 /**
  * 初始化SDK配置
  */
   Vhall.config({
     appId :'',//应用 ID ,必填
     accountId :'',//第三方用户唯一标识,必填
     token:'',//token必填
   })     

注意:

1.此方法必须写在Vhall.ready事件之后。

2.appId获取方式,参考[推流准备]的“创建应用 获取AppID”

3.token生成方式,参考[推流准备]的“获取直播间 access_token”

4.此处的toekn,即为参考准备的access_token。

4.初始化推流

推流之前,需要初始化推流对象VHPublisher

 /**
  * 初始化推流
  */
  VHPublisher.init({
    roomId:'lss_22b89748',//房间名称
    videoNode:'my-publisher',//推流容器
    //调用推流接口后完成事件,注意,是调用接口事件完成,不是推流结束。
    complete:function(){
      //TODO
    }
  });

注意:

1.此方法必需写在Vhall.ready事件里。

2.roomId获取方式,参考[推流准备]的“创建直播间 获取roomId”

3.videoNode,为推流回显容器的Id,需要开发者自己在需要显示回显的地方,创建一个空div,然后给Id命名,再将id名称写入此参数。参考 “创建推流器对象”

5.推流

最后一步,推流。 此方法既可以不传任何参数来调用(使用默认参数),也可以自定义参数来调用,如下示例:

 /**
  * 简单调用方法
  */
  VHPublisher.startPush();
 /**
  * 自定义参数调用方法
  */
  VHPublisher.startPush({
    camera:'',//摄像头名称,不传值则使用默认摄像头
    mic:'',//麦克风名称,不传值则使用默认麦克风
    width:'',//推流分辨率的宽度,不传值则使用默认分辨率:853,
    height:'',//推流分辨率的高度,不传值则使用默认分辨率:480
    //成功回调,非必填
    success:function(){
      //after success todo 
    },
    //失败回调,非必填
    fail:function(){
      //after failed todo
    }
  });

注意: 此方法必需写在Vhall.ready事件里。

完整例子代码


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>发起直播</title>
  <script src="https://static.vhallyun.com/jssdk/vhall-jssdk-live-stream-1.0.0.js?v=201802021400"></script>
  <script src="https://static.vhallyun.com/jssdk/vhall-jssdk-base-1.0.0.js?v=201802021400"></script>
  <style>
    body{
      background-color: #000;
    }
    .ctrl-box{
      margin:0 auto;
      text-align: center;
      margin:10% 0px 30px 0px;
    }
    .video-box{
      margin:0 auto;
      width: 854px;
      height: 480px;
    }
    #btn-start-push{
      min-width: 80px;
      padding: 5px 10px;
      height: 30px;
      background-color: #1f88e4;
      border: 1px solid #1f88e4;
      border-radius: 2px;
      color: #fff;
      outline: none;
    }
  </style>
</head>
<body>
  <div class="ctrl-box"><button id="btn-start-push">开推</button></div>
  <div class="video-box" >
    <div id="my-publisher" ></div>
  </div>

</body>
<script>

 /**
  * 注册ready事件
  */
  Vhall.ready(function(){

   /**
    * 错误事件监听
    */
      VHPublisher.error(function(e){
        console.error(e.msg);
      });

   /**
    * 初始化推流
    */
      VHPublisher.init({
      roomId:'lss_c063b5c9',//房间名称
      videoNode:'my-publisher',//推流容器
      //调用推流接口后完成事件,注意,是调用接口事件完成,不是推流结束。
      complete:function(){
        //TODO
      }
    });

  });

 /**
  * 初始化配置
  */
   Vhall.config({
       appId :'76043aaf',//应用 ID ,必填
       accountId :'10000126',//第三方用户唯一标识,必填
       token:'',//token必填
   });

  var startBtn = document.getElementById('btn-start-push');
    startBtn.addEventListener('click',startPush);

  /**
   * 开始推流
   */
    function startPush(){
      startBtn.innerHTML = '启动推流中...';
      VHPublisher.startPush({
        success: function(){
          startBtn.removeEventListener('click',startPush);
          startBtn.innerHTML = '停推';
          startBtn.addEventListener('click',stopPush);
        },
        fail: function(e){
          console.error('推流出错',e.msg);
        },
        complete: function(e){
          
        }  
      });
    }
  
  /**
   * 停止推流
   */
    function stopPush(){

      VHPublisher.stopPush({
        complete: function(){
          startBtn.removeEventListener('click',stopPush);
          startBtn.addEventListener('click',startPush);
          startBtn.innerHTML = '开推'
        }
      });
    }

</script>
</html>

其他相关文档

  1. 快速开始
  2. 如何集成观看直播
  3. 发起直播参考手册

如何通过 SDK 观看直播    

iOS SDK 如何观看直播    

观看准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 设置应用Bundle ID

  4. 获取 roomId

    • 使用发起直播的 roomId
    • 创建直播间 可以通过 【测试工具】 或 【API】 获得
  5. 获取直播间包含看直播权限的access_token

    可以通过 【测试工具】 或 【API】 获得

工程配置

在开始使用sdk之前,我们要配置好IDE和创建基础的工程代码。相关内容在【工程配置】中有详细说明。

时序图

注:已知直播间ID的情况下虚线框部分无需请求。

对接流程

1: 引入直播播放器头文件

#import "VHLivePlayer.h"

2: 创建直播播放器

SDK 中的 VHLivePlayer 模块负责实现直播播放功能。

_livePlayer = [[VHLivePlayer alloc] init];

3: 设置 渲染View、delegate

  • delegate 设置播放器代理
  • 接下来我们要给播放器的视频画面找个地方来显示,iOS系统中使用 view 作为基本的界面渲染单位,所以您只需要准备一个 view 并调整好布局就可以了。
_livePlayer.delegate = self;
_livePlayer.view.frame = self.view.bounds;
[self.view insertSubview:_livePlayer.view atIndex:0];

如果您要调整渲染画面的大小,只需要调整_livePlayer.view大小和位置即可

4: 开始播放

roomId 和 accessToken 参考页首观看准备

NSString* roomId = @"lss_xxxxxx";
NSString* accessToken = @"xxxxxxxxxx";
[_livePlayer startPlay:roomId accessToken:accessToken];

5: 画面调整

_livePlayer.scalingMode = VHPlayerScalingModeAspectFit;

可选值 含义
VHPlayerScalingModeFill 将图像拉伸填充
VHPlayerScalingModeAspectFit 将图像等比例缩放,适配最长边,缩放后的宽和高都不会超过显示区域,居中显示,画面可能会留有黑边
VHPlayerScalingModeAspectFill 将图像等比例铺满整个屏幕,多余部分裁剪掉,此模式下画面不会留黑边,但可能因为部分区域被裁剪而显示不全

6: 清晰度切换

_livePlayer.curDefinition = VHDefinitionOrigin;
可选值 含义
VHDefinitionOrigin 原画
VHDefinitionUHD 超高清
VHDefinitionHD 高清
VHDefinitionSD 标清
VHDefinitionAudio 纯音频

7: 静音

默认为NO 关闭静音状态 开启静音状态设置为YES即可

_livePlayer.mute = YES;

8: 暂停/恢复播放

对于直播播放而言,并没有真正意义上的暂停,所谓的直播暂停,只是画面冻结和关闭声音,而云端的视频源还在不断地更新着,所以当您调用 resume 的时候,会从最新的时间点开始播放,这跟点播是有很大不同的(点播播放器的暂停和继续与播放本地视频文件时的表现相同)。

// 暂停
[_livePlayer pause];
// 恢复
[_livePlayer resume];

9: 结束播放

结束当前直播,播放器资源并未释放

[_livePlayer stopPlay];

10: 销毁播放器

释放播放器资源

[_livePlayer destroyPlayer];

播放器皮肤

/**
 设置播放器皮肤
 @param skinView 播放器皮肤,继承于VHPlayerSkinView的子类view。
 @discussion 可继承VHPlayerSkinView自定义播放器皮肤,并实现父类的相关方法。也可不使用此方法,完全自定义播放器皮肤并添加到播放器view上。
 */
- (void)setPlayerSkinView:(VHPlayerSkinView *)skinView;

微吼云提供了设置播放器皮肤的Api和播放器皮肤源代码(见Demo),用户可自定义播放器皮肤,也可直接使用系统提供的开源皮肤。只需要设置皮肤到播放器即可实现播放控制等。

事件处理

  • 播放状态监听

SDK 通过 VHLivePlayerDelegate 代理来监听播放相关的状态和事件

具体 VHLivePlayerDelegate 中方法参考【发起直播参考手册

  • 推流状态
状态 含义
VHPlayerStatusLoading 加载中
VHPlayerStatusPlaying 播放中
VHPlayerStatusStop 停止播放
VHPlayerStatusPause 播放暂停
  • 错误通知
错误类型 数值 含义说明
VHivePlayGetUrlError 1 获取服务器rtmpUrl错误
VHLivePlayParamError 2 参数错误
VHLivePlayRecvError 3 接受数据错误
VHLivePlayCDNConnectError 4 CDN链接失败
VHLivePlayStopPublish 5 已停止推流

快速集成代码

可以把观看直播代码写到 ViewController.m 的 viewDidLoad 方法中测试观看,代码如下:

//
//  ViewController.m
//  TestProject
//
//  Created by vhall on 2018/3/12.
//  Copyright © 2018年 vhall. All rights reserved.
//

#import "ViewController.h"

#import "VHLivePlayer.h"

@interface ViewController ()<VHLivePlayerDelegate>
@property (nonatomic,strong)VHLivePlayer *livePlayer;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //构造并初始化播放器
    _livePlayer = [[VHLivePlayer alloc] init];
    //设置代理
    _livePlayer.delegate = self;
    //设置显示区域
    _livePlayer.view.frame = self.view.bounds;
    //加入显示view
    [self.view insertSubview:_livePlayer.view atIndex:0];
    
    //开始播放
    NSString* roomId        = @"lss_xxxxxx";//roomId 获得方式 参考页面开始处
    NSString* accessToken   = @"xxxxxxxxxx";//accessToken 获得方式 参考页面开始处
    [_livePlayer startPlay:roomId accessToken:accessToken];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)viewDidLayoutSubviews
{
    //刷新播放器画面位置
    _livePlayer.view.frame = self.view.bounds;
}

#pragma mark - VHLivePlayerDelegate
/**
 *  错误回调
 *  @param player   播放器实例
 *  @param error    错误
 */
- (void)player:(VHLivePlayer *)player stoppedWithError:(NSError *)error
{
    NSLog(@"错误: %@",error );
}

/**
 *  播放过程中下载速度回调
 *  @param player   播放器实例
 *  @param speed    kb/s
 */
- (void)player:(VHLivePlayer *)player downloadSpeed:(NSString*)speed
{
    NSLog(@"缓冲速度:%@ Kb/s",speed);
}

@end

其他相关文档

  1. 快速开始
  2. 如何集成发起直播
  3. 发起直播参考手册

Android SDK 如何观看直播    

观看准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 设置应用包名、签名

  4. 创建直播间 获取roomId

    可以通过 【测试工具】 或 【API】 获得

  5. 获取直播间包含看直播权限的access_token

    可以通过 【测试工具】 或 【API】 获得

工程配置

在开始使用sdk之前,我们要配置好IDE和创建基础的工程代码。相关内容在【工程配置】中有详细说明。

时序图

注:已知直播间ID的情况下虚线框部分无需请求。

对接流程

1 VHLivePlayer

1.1 VHVideoPlayerView 获取View

通过FindViewById 获取View的实例,此View重要用于看直播,拉流的数据会直接渲染到此View上,lss服务内部实现的一个普通渲染方案。

<com.vhall.lss.play.impl.VHVideoPlayerView
        android:id="@+id/player"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

渲染视图上添加水印,水印添加方式:1. 控制台配置;2.VHVideoPlayerView 代码设置;

说明:水印生效以先加载为准,控制台配置在初始化房间信息后异步加载;

 mVideoPlayer.setWaterMark(drawable);
 mVideoPlayer.setWaterMarkGravity(Gravity.LEFT);
    /**
     * 设置水印
     *
     * @param drawable
     */
    public void setWaterMark(Drawable drawable)
    /**
     * 设置水印的相对位置
     *
     * @param gravity Gravity.LEFT
     */
    public void setWaterMarkGravity(int gravity) 

1.2 构造VHLivePlayer

VHLivePlayer采用builder模式构造,也是观看直播的核心方法,更多构造参数,参见builder类具体内容

/**
 * 构造VHLivePlayer
 * Builder 具体参考1.3
 */
mPlayer = new VHLivePlayer.Builder()
	.videoPlayer(mVideoPlayer) // 播放视频View
	.listener(new MyListener()) // 添加监听,具体监听事件参考本文的事件监听
	.build();

1.3 VHLivePlayer的 Builder

IVHVideoPlayer/IVHAudioPlayer为视频、音频播放接口,用户可实现此接口来自定义视频渲染和音频播放。

Builder 描述
videoPlayer 添加视频播放器
aideoPlayer 添加音频播放器
listener 添加监听
reconnectTimes 重连次数
connectTimeout 超时时间
bufferSeconds 缓冲时间

2 开始观看

/**
 * 开始观看,传递观看准备中配置的roomId (房间ID)和AccessToken;
 * 次方法属于 VHLivePlayer
 * @param String roomId ; // 房间ID  通过 API 调用
 * @param String accessToken; // 发起的Token  通过 API 调用
 */
public void start(String roomId  , String accessToken);

3 设置观看显示模式

调整观看的预览模式,

显示模式 参数
VHLivePushFormat.DRAW_MODE_ASPECTFILL 将图像等比例铺满整个屏幕,多余部分裁剪掉,此模式下画面不会留黑边,但可能因为部分区域被裁剪而显示不全
VHLivePushFormat.DRAW_MODE_ASPECTFIT 将图像等比例缩放,适配最长边,缩放后的宽和高都不会超过显示区域,居中显示,画面可能会留有黑边
VHLivePushFormat.DRAW_MODE_NONE 默认
/**
 * 设置预览模式,具体查看表格
 * 次方法属于 VHLivePlayer
 * @param int mode 预览的类型
 */
public void setDrawMode(int mode);

4 设置观看清晰度

从 IVHLivePlayer.EVENT_DPI_LIST 获取当前地址可用的分辨率,确定可用的情况下在切换

清晰度 描述
IVHLivePlayer.DPI_SD 低清
IVHLivePlayer.DPI_HD 高清
IVHLivePlayer.DPI_XHD 超清
IVHLivePlayer.DPI_AUDIO 纯音频
IVHLivePlayer.DPI_SAME 原画
/**
 * 在设置清晰度时,需要先获取当前的视频可用的分辨率,确认可用的时在调用。
 * 次方法属于 VHLivePlayer
 * @param int dpi 定义的清晰度
 */
public void.setDPI(dpi);

5 暂停观看/ 恢复观看

停止拉流,而云端的视频源还在不断地更新着 , 当重新恢复时,会从最新的时间点播放

/**
 * 暂停观看/ 恢复观看
 * 次方法属于 VHLivePlayer
 */
public void pause();
public void resume();

6 结束观看

停止拉流,此时调用Stop()方法,不在继续拉流,播放器的实例还在,

/**
 * 停止拉流
 * 次方法属于 VHLivePlayer
 */
public void stop();

7 销毁

当调用release() 方法时,视频播放器和音频播放器被释放, 如果需要再次使用请重新初始化

/**
 * 退出播放并释放相关资源。
 * 次方法属于 VHLivePlayer
 */
public void release();

事件处理

观看事件 描述
IVHLivePlayer.EVENT_STATUS_STARTED 拉流成功
IVHLivePlayer.EVENT_STATUS_STOPED 拉流停止
IVHLivePlayer.EVENT_DPI_LIST 可用的清晰度
IVHLivePlayer.EVENT_DPI_CHANGED 清晰度改变
IVHLivePlayer.EVENT_DOWNLOAD_SPEED 下载速度
IVHLivePlayer.EVENT_START_BUFFER 开始缓冲
IVHLivePlayer.EVENT_STOP_BUFFER 停止缓冲
IVHLivePlayer.EVENT_VIDEO_SIZE_CHANGED 视频宽高发生改变
IVHLivePlayer.EVENT_STREAM_START 发起端发起
IVHLivePlayer.EVENT_STREAM_STOP 发起端停止
错误事件 描述
IVHLivePlayer.ERROR_CONNECT 连接错误
class MyListener implements VHPlayerListener {

        @Override
        public void onEvent(int event, String msg) {
            switch (event) {
                case IVHLivePlayer.EVENT_STATUS_STARTING:
                    break;
                case IVHLivePlayer.EVENT_STATUS_STARTED:
                    mPlayBtn.setImageResource(R.mipmap.icon_pause_bro);
                    break;
                case IVHLivePlayer.EVENT_STATUS_STOPED:
                    break;
                case IVHLivePlayer.EVENT_DPI_LIST:
                    break;
                case IVHLivePlayer.EVENT_DPI_CHANGED:
                    break;
                case IVHLivePlayer.EVENT_DOWNLOAD_SPEED:
                    break;
                case IVHLivePlayer.EVENT_START_BUFFER:
                    break;
                case IVHLivePlayer.EVENT_STOP_BUFFER:
                    break;
                case IVHLivePlayer.EVENT_VIDEO_SIZE_CHANGED:
                    break;
            }
        }

        @Override
        public void onError(int errorCode, String msg) {
            switch (errorCode) {
                case IVHLivePlayer.ERROR_CONNECT:
                    break;
                case IVHLivePlayer.ERROR_SEND:
                    break;
                case IVHLivePlayer.ERROR_PARAM:
                    break;
            }
        }
    }

示例代码:

public class LivePlayerActivity extends Activity {

    private static final String TAG = "LivePlayerActivity";

    VHLivePlayer mPlayer;
    VHVideoPlayerView mVideoPlayer;
    MyReceiver myReceiver;
    private String roomId = "";
    private String accessToken = "";
    //data
    String currentDPI = "";
    List<String> dipList = new ArrayList<>();
    int drawmode = IVHVideoPlayer.DRAW_MODE_NONE;
    //view
    ImageView mPlayBtn;
    ProgressBar mLoadingPB;
    TextView mSpeedTV;
    private DPIPopu popu;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        roomId = getIntent().getStringExtra("roomid");
        accessToken = getIntent().getStringExtra("token");
        setContentView(R.layout.player_layout);
        mVideoPlayer = (VHVideoPlayerView) this.findViewById(R.id.player);
        mPlayer = new VHLivePlayer.Builder().videoPlayer(mVideoPlayer).listener(new MyListener()).build();

        mPlayBtn = (ImageView) this.findViewById(R.id.btn_play);
        mLoadingPB = (ProgressBar) this.findViewById(R.id.pb_loading);
        mSpeedTV = (TextView) this.findViewById(R.id.tv_speed);
        popu = new DPIPopu(this);
        popu.setOnDPIChangedListener(new DPIPopu.OnDPIChangedListener() {
            @Override
            public void onDPIChanged(String dpi) {
                mPlayer.setDPI(dpi);
                currentDPI = dpi;
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mPlayer.isPlaying())
            mPlayer.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mPlayer.resumeAble())
            mPlayer.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPlayer.release();
        unRegistReceiver();
    }

    public void play(View view) {
        if (mPlayer.isPlaying()) {
            mPlayer.stop();
        } else {
            if (mPlayer.resumeAble())
                mPlayer.resume();
            else
                mPlayer.start(roomId, accessToken);
        }
    }

    public void changeDPI(View view) {
        popu.showAtLocation(getWindow().getDecorView().findViewById(android.R.id.content), Gravity.CENTER, 0, 0);
    }

    public void changeMode(View view) {
        mVideoPlayer.setDrawMode(++drawmode % 3);
    }

    class MyListener implements VHPlayerListener {

        @Override
        public void onEvent(int event, String msg) {

            switch (event) {
                case IVHLivePlayer.EVENT_STATUS_STARTING:
                    break;
                case IVHLivePlayer.EVENT_STATUS_STARTED:
                    mPlayBtn.setImageResource(R.mipmap.icon_pause_bro);
                    break;
                case IVHLivePlayer.EVENT_STATUS_STOPED:
                    mPlayBtn.setImageResource(R.mipmap.icon_start_bro);
                    break;
                case IVHLivePlayer.EVENT_DPI_LIST:
                    Log.i(TAG, "DPILIST:" + msg);
                    try {
                        JSONArray array = new JSONArray(msg);
                        if (array != null && array.length() > 0) {
                            dipList.clear();
                            for (int i = 0; i < array.length(); i++) {
                                dipList.add((String) array.get(i));
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    popu.notifyDataSetChanged(currentDPI, dipList);
                    break;
                case IVHLivePlayer.EVENT_DPI_CHANGED:
                    Log.i(TAG, "DPI:" + msg);
                    if (!msg.equals(currentDPI))
                        currentDPI = msg;
                    popu.notifyDataSetChanged(currentDPI, dipList);
                    break;
                case IVHLivePlayer.EVENT_DOWNLOAD_SPEED:
                    mSpeedTV.setText(msg + "kb/s");
                    break;
                case IVHLivePlayer.EVENT_START_BUFFER:
                    mLoadingPB.setVisibility(View.VISIBLE);
                    break;
                case IVHLivePlayer.EVENT_STOP_BUFFER:
                    mLoadingPB.setVisibility(View.GONE);
                    break;
                case IVHLivePlayer.EVENT_VIDEO_SIZE_CHANGED:
                    Log.i(TAG, msg);
                    break;
            }


        }

        @Override
        public void onError(int errorCode, String msg) {
            mLoadingPB.setVisibility(View.GONE);
            Log.i(TAG, "errorCode:" + errorCode + ",msg:" + msg);
            switch (errorCode) {
                case IVHLivePlayer.ERROR_CONNECT:
                    break;
                case IVHLivePlayer.ERROR_SEND:
                    break;
                case IVHLivePlayer.ERROR_PARAM:
                    break;
            }

        }
    }
}

其他相关文档

  1. 快速开始
  2. 如何集成发起直播
  3. 发起直播参考手册

JS SDK 如何观看直播    

使用微吼云JS SDK,只需三大步再5小步,就能快速观看直播。

跟随本文的步骤,即使你对Javascript语言不熟悉,也完全可以做到。

其中,一、二步为准备工作,第三步为代码接入,下面,就分步来说明。

一.观看准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 创建直播间 获取roomId

    可以通过 【测试工具】 或 【API】 获得

  4. 获取直播间包含看直播权限的access_token

    可以通过 【测试工具】 或 【API】 获得

时序图

注:已知直播间ID的情况下虚线框部分无需请求。

二.引入sdk文件

接下来,我们正式接入sdk: 将下面sdk引入代码,插入页面的head标签里。

<link rel="stylesheet" href="https://static.vhallyun.com/jssdk/videojs.min.css?v=1.0.0"><!--播放器默认样式,需要引用在包含在页面的head标签里-->
<script src="https://static.vhallyun.com/jssdk/dvideo-plugin.js?v=1.0.0"></script><!--依赖的播放器资源-->
<script src="https://static.vhallyun.com/jssdk/vhall-jssdk-player-1.6.2.js"></script>
<script src="https://static.vhallyun.com/jssdk/vhall-jssdk-base-1.0.0.js"></script>

注意:

1.直接用本地网页(file协议,地址栏以file:///开头)是调试不了的,需要运行在Server上(https或http协议,地址栏以https:// 或http:// 开头)才能正常调试。

2.上面两个文件都需要引用,而且顺序需要保持与上面一致。

3.建议直接复制上面代码

三.代码对接

至此,你已完成所有观看直播准备工作,距离完成,只差以下4步:

1.页面创建播放器容器

在需要web播放的页面位置加入播放器对象容器,也就是放一个div,然后给它取个名字,比如: my-video 。之后推流回显画面都会在这个容器里渲染,容器的大小控制您可以使用div的属性进行控制,示例代码如下:

<div id="my-video" style="width:100%; height:450px;"></div>

2.注册ready事件

接下来,在页面里写javascript代码,调用sdk提供的接口,注册sdk ready事件,接口调用方法如下:

 /**
  * 注册ready事件
  */
  Vhall.ready(function(){
    //TODO
  })

注意:所有观看逻辑需要写在此事件里。

3.初始化SDK配置

接下来需要传入相关参数,初始化配置:

  /**
   * 初始化配置
   */
   Vhall.config({
     appId :'',//应用 ID ,必填
     accountId :'',//第三方用户唯一标识,必填
     token:'',//token必填
   })     

注意:

1.appId获取方式,参考[推流准备]的“创建应用 获取AppID”

2.token生成方式,参考[推流准备]的“获取直播间 access_token”

3.此处的toekn,即为参考准备的access_token。

4.播放器初始化

观看直播之前,需要初始化推流对象VhallPlayer

   /**
    * 播放器初始化
    */
    VhallPlayer.init({
        roomId:'', //房间ID,直播必填,点播不写
        recordId:'',//回放Id,点播必填,直播不写
        type:'live',//播放类型,必填,live 直播, vod 为点播
        videoNode:'',//推流视频回显节点id,必填
        complete:function(){

        },
        //播放器错误事件监听
        error:function(reason){
            console.log('player error');
        }
    });

注意:

1.此方法必需写在Vhall.ready事件里。

2.roomId获取方式,登陆微吼云>>进入应用管理>>找到对应需要推流的应用>>点“直播管理”>>房间管理>>取得相应房间ID。

3.videoNode,为推流回显容器的Id,需要开发者自己在需要显示回显的地方,创建一个空div,然后给Id命名,再将id名称写入此参数。

5.播放

最后一步,播放。 示例:

 /**
  * 播放
  */
  VhallPlayer.play();

注意: 此方法必需写在Vhall.ready事件里。

完整例子代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>观看直播</title>
  <link rel="stylesheet" href="https://static.vhallyun.com/jssdk/videojs.min.css?v=1.0.0"><!--播放器默认样式,需要引用在包含在页面的head标签里-->
  <script src="https://static.vhallyun.com/jssdk/dvideo-plugin.js?v=1.0.0"></script><!--依赖的播放器资源-->
  <script src="https://static.vhallyun.com/jssdk/vhall-jssdk-player-1.0.0.js"></script>
  <script src="https://static.vhallyun.com/jssdk/vhall-jssdk-base-1.0.0.js"></script>
  <style>
    body{
      background-color: #000;
    }
    .video-box{
      margin:0 auto;
      width: 854px;
      height: 480px;
    }
  </style>
</head>
<body>
  <div class="video-box" >
    <div id="myVideo" style="width:100%; height:450px;"></div>
  </div>

</body>
<script>
  
 /**
  * 注册ready事件
  */
  Vhall.ready(function(){
     /**
      * 播放器初始化
      */
      VhallPlayer.init({
          roomId:'lss_c063b5c9', //房间ID,直播必填,点播不写
          recordId:'',//回放Id,点播必填,直播不写
          type:'live',//播放类型,必填,live 直播, vod 为点播
          videoNode:'myVideo',//推流视频回显节点id,必填
          complete:function(){
        
          /**
           * 播放
           */
            VhallPlayer.play();
          }
      });

  });
  
 /**
  * 初始化配置
  */
   Vhall.config({
       appId :'76043aaf',//应用 ID ,必填
       accountId :'10000126',//第三方用户唯一标识,必填
       token:'',//token必填
   });


</script>
</html>

其他相关文档

  1. 快速开始
  2. 如何集成发起直播
  3. 观看直播参考手册
JS SDK 集成    

使用微吼云JS SDK,只需三大步再5小步,就能快速观看直播。

跟随本文的步骤,即使你对Javascript语言不熟悉,也完全可以做到。

其中,一、二步为准备工作,第三步为代码接入,下面,就分步来说明。

一.观看准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 创建直播间 获取roomId

    可以通过 【测试工具】 或 【API】 获得

  4. 获取直播间包含看直播权限的access_token

    可以通过 【测试工具】 或 【API】 获得

时序图

注:已知直播间ID的情况下虚线框部分无需请求。

二.引入sdk文件

接下来,我们正式接入sdk: 将下面sdk引入代码,插入页面的head标签里。

<script src="vhall-jssdk-player-VERSION.js"></script>
<script src="vhall-jssdk-base-1.0.0.js"></script>

注意:

1.直接用本地网页(file协议,地址栏以file:///开头)是调试不了的,需要运行在Server上(https或http协议,地址栏以https:// 或http:// 开头)才能正常调试。

2.上面两个文件都需要引用,而且顺序需要保持与上面一致。

三.代码对接

1.页面创建播放器容器

在需要web播放的页面位置加入播放器对象容器,也就是放一个div,然后给它取个名字,比如: my-video 。之后推流回显画面都会在这个容器里渲染,容器的大小控制您可以使用div的属性进行控制,示例代码如下:

<div id="my-video" style="width:100%; height:450px;"></div>

2.初始化SDK配置

接下来需要传入相关参数,初始化配置:

 // 创建实例参数
var opt = {
	appId:'',// 应用ID,必填
	accountId: '', // 第三方用户ID,必填
	token: '', // access_token,必填
	type: '',   // live 直播  vod 点播  必填
	videoNode: "videoNode", // 播放器的容器, div的id 必填
	poster: 'http://xxx.jpg',  // 封面地址  仅支持.jpg
	liveOption:{
		type:'hls'  // 直播播放类型  hls | flv
		roomId: '', // 直播房间ID
	} ,
	vodOption: {
		recordId:''  // 回放 ID
	}
};
// 成功回调
var success = function (event) {
 // 实例句柄
 var vhallplayer= event.vhallplayer;
};
// 失败回调
var failure = function (event) {
  console.log(event);
};
 
// 创建实例
VhallPlayer.createInstance(opt, success, failure);

注意:

1.appId获取方式,参考[推流准备]的“创建应用 获取AppID”

2.token生成方式,参考[推流准备]的“获取直播间 access_token”

3.此处的toekn,即为参考准备的access_token。

JS SDK 使用    
  • 播放器SDK主要分为: 实例创建与销毁、实例事件监听、实例接口使用、全局定义,四大部分。

播放器实例

  • 此SDK可支持创建多个实例,每一个实例对应一个播放器实例。

创建实例

// 创建实例参数
var opt = {
	appId:'', // 应用ID   必填
	accountId: '', // 第三方用户ID     必填
	token:'', // access_token  必填
	type:'', // live 直播  vod 点播  必填
	videoNode:'videoNode', // 播放器的容器
	poster:"http://xxx.jpg", // 封面地址
	liveOption:{
		type:'hls'    // 直播播放类型   hls | flv
		roomId:'', // 直播房间ID  必填
	},
	vodOption:{
		recordId:'' // 回放 ID
	}
}
// 成功回调
var vhallplayer;
var success = function(event){
	// 实例句柄
	vhallplayer = event.vhallplayer;
};
// 失败回调
var failure = function(event){
	console.log(event);
}
// 创建实例
VhallPlayer.createInstance(opt, success, failure);
  • videoNode为Dom容器的id
  • type为live时则使用liveOption,反之则使用vodOption
  • VhallPlayer 为SDK全局句柄
  • vhallplayer 为当前传入播放器实例句柄,故以下所有操作均必须在成功回调后执行。

销毁实例

vhallplayer.destroy();    // 销毁当前实例

实例事件监听

  • 在调用实例接口前,建议全部监听以下事件

事件监听

vhallplayer.on(event , handler);   // 事件监听

实例接口使用

  • 由于播放器内核原因,接口的成功或失败采用事件监听模式来判断。
  • 接口中的failure回调为参数校验

设置循环状态(仅点播可用)

var isLoop = true; // true 为循环    false 为非循环
// 失败回调
var failure = function(event){
	console.log(event);
};
vhallplayer.setLoop(isLoop  , failure); // 设置循环状态

获取循环状态(仅点播可用)

// 失败回调
var failure = function(event){
	console.log(event);
};
vhallplayer.getLoop(); // true 为循环状态   false为非循环状态

获取当前视频总时长(仅点播可用)

// 失败回调
var failure = function (event) {
  console.log(event);
};
vhallplayer.getDuration(failure);

获取当前视频播放时间(仅点播可用)

// 失败回调
var failure = function (event) {
  console.log(event);
};
vhallplayer.getCurrentTime(failure);

设置当前播放时间(仅点播可用)

var time = 0;   // 秒
// 失败回调
var failure = function (event) {
  console.log(event);
};
vhallplayer.setCurrentTime(time , failure);

设置seek限制(仅点播可用)

var opt = {
	enable:true,  // true为开启seek限制 , false为关闭seek限制
	maxTime:60   // seek最大值 number类型
};
var failure - function(event){
	console.log(event);
};
vhallplayer.setLimitSeek(opt , failure);

获取当前seek限制信息(仅点播可用)

var failure = function(event){
	console.log(event);
};
vhallplayer.getLimitSeek(failure);

获取当前可选倍速(仅点播可用)

vhallplayer.getUsableSpeed();  // 可选倍速列表

设置倍速播放(仅点播可用)

var list = vhallplayer.getUsableSpeed();  // 可选倍速列表
// 失败回调
var failure = function(event){
	console.log(event);
};
vhallplayer.setPlaySpeed(list[0] , failure);
  • 该方法参数只能为倍速列表已存在的一项

播放

vhallplayer.play();   // 播放

暂停

vhallplayer.pause();   // 暂停

获取当前暂停状态

vhallplayer.getIsPause();   // true 为暂停状态    false为播放状态

获取视频清晰度列表

vhallplayer.getQualitys();    // 获取视频清晰度列表
  • 该接口返回当前可用的视频清晰度列表。

获取当前视频清晰度

vhallplayer.getCurrentQuality();    // 获取当前视频清晰度

设置当前视频清晰度

var qualityList = vhallplayer.getQualitys();   // 获取清晰度列表
// 失败回调
var failure = function(event){
	console.log(event);
};
vhallplayer.setQuality(qualityList[0] , failure);  // 设置当前视频清晰度
  • 传入的清晰度应为清晰度列表中的一项。

进入全屏

// 失败回调
var failure = function(event){
	console.log(event);
};
vhallplayer.enterFullScreen(failure );   // 进入全屏

退出全屏

// 失败回调
var failure = function(event){
	console.log(event);
};
vhallplayer.exitFullScreen(failure);  // 退出全屏

获取当前是否是全屏

vhallplayer.isFullScreen();   // true为全屏状态   false为非全屏状态

设置静音

var isMute = true;  // true为静音  false为取消静音
// 失败回调
var failure = function(event){
	console.log(event);
};
vhallplayer.setMute(isMute , failure);   // 设置静音

获取音量

vhallplayer.getVolume(); // 0~100

设置音量

var volume = 50;   // 音量 0~100
// 失败回调
var failure = function (event) {
  console.log(event);
};
vhallplayer.setVolume(volume , failure );

获取当前网络状态

vhallplayer.getNetworkState();  //  获取当前网络状态
  • 0为 音频/视频尚未初始化
  • 1为 音频/视频是活动的且已选取资源,但并未使用网络
  • 2为 浏览器正在下载数据
  • 3为 未找到音频/视频来源

视频截图

var imgBase64Data = vhallplayer.videoScreenshot(); // 视频截图
  • 截图后生成Base64

全局定义

播放器事件参考表

可选值 事件 备注
VhallPlayer.CURRENTTIME_CHANGE 当前时间改变 点播当前播放时间被改变时触发
VhallPlayer.LOOP_CHANGE 循环状态改变 点播循环状态被改变时触发
VhallPlayer.MUTE_CHANGE 静音状态改变 静音状态被改变时触发
VhallPlayer.RATE_CHANGE 倍速改变 倍速被改变时触发
VhallPlayer.VOLUME_CHANGE 声音改变 声音被改变时触发
VhallPlayer.FULLSCREEN_CHANGE 全屏状态改变 全屏状态改变时触发
VhallPlayer.DEFINITION_CHANGE 当前清晰度改变 当前清晰度改变时触发(卡顿时自动切清晰度触发,手动切换不触发)
VhallPlayer.LAG_REPORT 卡顿 视频卡顿时触发
VhallPlayer.LAG_RECOVER 卡顿恢复 视频卡顿恢复时触发
VhallPlayer.PALY 开始播放 点播开始播放时触发
VhallPlayer.PAUSE 暂停 点播暂停时触发
VhallPlayer.PROGRESS 视频加载中 点播视频加载中时触发
VhallPlayer.LOADED 视频加载完成 点播视频加载完成时触发
VhallPlayer.ERROR 播放器出错 播放器自身出现错误时触发
VhallPlayer.ENDED 播放完毕 点播视频播放完毕时触发
VhallPlayer.OPEN_BARRAGE 开启弹幕 开启弹幕时触发
VhallPlayer.CLOSE_BARRAGE 关闭弹幕 关闭弹幕时触发
VhallPlayer.CLEAR_BARRAGE 清空弹幕 清空弹幕时触发
VhallPlayer.TIMEUPDATE 播放时间改变 播放时间改变时触发

错误码

code message
611000 初始化播放器失败
611001 无效的参数
611002 服务器返回错误
611004 此方法仅点播可用
611005 进入全屏失败
611006 退出全屏失败
611008 appId不存在
611009 roomId不存在
611010 token不存在
611011 recordId不存在
JS SDK v1.0集成(旧版)    

使用微吼云JS SDK,只需三大步再5小步,就能快速观看直播。

跟随本文的步骤,即使你对Javascript语言不熟悉,也完全可以做到。

其中,一、二步为准备工作,第三步为代码接入,下面,就分步来说明。

一.观看准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 创建直播间 获取roomId

    可以通过 【测试工具】 或 【API】 获得

  4. 获取直播间包含看直播权限的access_token

    可以通过 【测试工具】 或 【API】 获得

时序图

注:已知直播间ID的情况下虚线框部分无需请求。

二.引入sdk文件

接下来,我们正式接入sdk: 将下面sdk引入代码,插入页面的head标签里。

<link rel="stylesheet" href="https://static.vhallyun.com/jssdk/videojs.min.css?v=1.0.0"><!--播放器默认样式,需要引用在包含在页面的head标签里-->
<script src="https://static.vhallyun.com/jssdk/dvideo-plugin.js?v=1.0.0"></script><!--依赖的播放器资源-->
<script src="https://static.vhallyun.com/jssdk/vhall-jssdk-player-1.6.2.js"></script>
<script src="https://static.vhallyun.com/jssdk/vhall-jssdk-base-1.0.0.js"></script>

注意:

1.直接用本地网页(file协议,地址栏以file:///开头)是调试不了的,需要运行在Server上(https或http协议,地址栏以https:// 或http:// 开头)才能正常调试。

2.上面两个文件都需要引用,而且顺序需要保持与上面一致。

3.建议直接复制上面代码

三.代码对接

至此,你已完成所有观看直播准备工作,距离完成,只差以下4步:

1.页面创建播放器容器

在需要web播放的页面位置加入播放器对象容器,也就是放一个div,然后给它取个名字,比如: my-video 。之后推流回显画面都会在这个容器里渲染,容器的大小控制您可以使用div的属性进行控制,示例代码如下:

<div id="my-video" style="width:100%; height:450px;"></div>

2.注册ready事件

接下来,在页面里写javascript代码,调用sdk提供的接口,注册sdk ready事件,接口调用方法如下:

 /**
  * 注册ready事件
  */
  Vhall.ready(function(){
    //TODO
  })

注意:所有观看逻辑需要写在此事件里。

3.初始化SDK配置

接下来需要传入相关参数,初始化配置:

  /**
   * 初始化配置
   */
   Vhall.config({
     appId :'',//应用 ID ,必填
     accountId :'',//第三方用户唯一标识,必填
     token:'',//token必填
   })

注意:

1.appId获取方式,参考[推流准备]的“创建应用 获取AppID”

2.token生成方式,参考[推流准备]的“获取直播间 access_token”

3.此处的toekn,即为参考准备的access_token。

如何通过SDK实现直播答题    

iOS SDK    

1工程配置

SDK支持iOS 9.0以上系统

1.1开发环境

  • Xcode 8或更高版本
  • OS X 10.10或更高版本

1.2 添加答题SDK库和头文件

VHYunSDK文件夹下VHBasePlatform VHImSDK VHLivePlayer

VHMediaSDK

Knowledge.bundle

libKnowledge.a

VHPrepareViewController.h

添加库和Framework

libc++.tbd

libz2.1.0.tbd

libicucore.tbd

libz.tbd

libiconv.tbd

CoreTelephony.framework

MediaPlayer.framework

AVFoundation.framework

VideoToolbox.framework

AssetsLibrary.framework

OpenAL.framework

OpenGLES.framework

QuartzCore.framework

CoreMedia.framework

Security.framework

1.3 工程设置修改

  • AppDelegate.m 文件名修改为AppDelegate.mm
  • Build Setting 中 Enable Bitcode 设置为NO
  • 设置Info.plist中 App Transport Security Settings -> Allow Arbitrary Loads 设置为 YES
  • 设置引用库路径

2 代码对接

1、引入头文件

import "VHPrepareViewController.h"

2、设置代理

@interface ViewController ()<VHPrepareViewControllerDelegate>
@end

3、设触发弹出答题页

(IBAction)btnClicked:(id)sender {
    VHPrepareViewController *vc = [[VHPrepareViewController alloc]initWithAppID:您的APPID
                                                                        unionID:用户唯一标示
                                                                       nickName:昵称
                                                                       headIcon:_头像url];
    vc.delegate = self;
    [self presentViewController:vc animated:YES completion:nil];
}

4、处理代理事件

pragma mark - VHPrepareViewControllerDelegate
//头像点击事件
- (void)viewController:(VHPrepareViewController*)viewController headBtnClicked:(NSString*)unionID
{
    NSLog(@"headBtnClicked unionID:%@",unionID);
}
//分享点击事件
- (void)viewController:(VHPrepareViewController*)viewController shareType:(NSInteger)type data:(NSDictionary*)data
{
    NSLog(@"shareBtnClicked: tag=%ld %@",(long)type,data);
    NSString *str;
    switch (type) {
        case 0:
            str = [NSString stringWithFormat:@"朋友圈 %@",data[@"inviteCode"]];
            break;
        case 1:
            str = [NSString stringWithFormat:@"微信 %@",data[@"inviteCode"]];
            break;
        case 2:
            str = [NSString stringWithFormat:@"QQ %@",data[@"inviteCode"]];
            break;
        default:
            break;
    }
}

Android SDK    

1工程配置

SDK支持Android 4.1以上系统

1.1开发环境

  • Android Studio
  • Java 1.7

2代码对接

2.1 导入AAR

将下载好的vhall_answer_sdk.aar 放入工程的libs中 ,并且在Gradle中配置AAR路径 如图

2.2 初始化SDK

 VhallSDK.getInstance().setLogLevel(LogLevel.FULL); // 设置显示所有的日志
 VhallSDK.getInstance().nativeLog(true);// 设置显示底层日志
 VhallSDK.getInstance().init(this, appId, userId);// 初始化信息

2.3 代码的引用

直接跳转PendingActivity.class 进入直播答题页面,

ID 字段 参数描述
1 id 用户的ID
2 nickname 用户的昵称
3 avatar 用户的头像

备注: 这些参数是用户从自己的用户体系中获取

Intent intent = new Intent(this, PendingActivity.class);
intent.putExtra("id", id);
intent.putExtra("nickname", nickname);
intent.putExtra("avatar", avatar);
startActivity(intent);

如何通过小程序发起直播    

使用微吼云服务,通过小程序推流,只需以下简单几步。

一.微吼服务注册准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 创建直播间 获取roomId 可以通过 【测试工具】 或 【API】 获得

  4. 获取直播间包含看直播权限的access_token 可以通过 【测试工具】 或 【API】获得

二.微信小程序注册准备

  1. 注册微信小程序 根据指引填写信息和提交相应的资料

  2. 设置小程序分类 登录微信公众平台,进入设置->基本设置->服务类目 将分类设置成下图红框标中的一种。

    注意:推流会用到小程序的live-pusher接口,此接口微信 只对五个分类开放,如上图标记。所以,我们 需要在这五个分类中选取一个。

  3. 设置小程序接口设置 进入设置->接口设置 将实时播放音视频流实时录制音视频流两个开关打开,如下图:

  4. 设置服务器域名 进入设置->开发设置 服务器域名里添加以下域名:

  • https://api.yun.vhall.com
  • https://t-open.e.vhall.com
  • https://t-dc.e.vhall.com
  • https://t-gslb-open.e.vhall.com
  • https://gslb.vhallyun.com
  • https://api.vhallyun.com

如下图所示:

三.开发工具准备

四.下载Demo源码

点击微吼小程序demo下载

五.载入工程

1. 扫描登录

打开微信开发工具,用微信扫描二维码登录。

2. 选择“小程序项目”

3. 载入项目文件

点击“项目目录”右侧下拉框,选择下载下来的微吼小程序demo目录“vhall-miniprogram”

4.载入完成

效果如下图

六. 填入推流参数

1.打开需要更换参数的文件

在微信开发工具的编辑器里,选择pages-> pusher-> index.data.js文件, 找到roomId和streamUrl,如下图

2. 登录微吼云,找到需要推流的参数。

登录微吼云,进入应用->应用管理->直播管理,打开直播配置选项卡,找到直播码推流地址,如下图

3. 将“直播码”填入第一步的roomId里,将“推流地址”填入streamUrl里,如下图所示

注意:streamUrl参数,需要在结尾需要加上/roomId,加后的效果如:rtmp://push.vhallyun.com/x?accesstoken=vhall/lss_c063b5c9

七.开始发起直播推流

到此,就可以预览推流效果了。

1. 点击微信开发工具的“预览”,用微信扫描二维码。

2. 点击“发起直播按钮”,如下图

推流效果图如下:

八.参考文档

如何通过小程序观看直播    

使用微吼云服务,通过小程序观看直播,只需以下简单几步。

一.微吼服务注册准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 创建直播间 获取roomId 可以通过 【测试工具】 或 【API】 获得

  4. 获取直播间包含看直播权限的access_token 可以通过 【测试工具】 或 【API】获得

二.微信小程序注册准备

  1. 注册微信小程序 根据指引填写信息和提交相应的资料

  2. 设置小程序分类 登录微信公众平台,进入设置->基本设置->服务类目 将分类设置成下图红框标中的一种。

    注意:推流会用到小程序的live-pusher接口,此接口微信 只对五个分类开放,如上图标记。所以,我们 需要在这五个分类中选取一个。

  3. 设置小程序接口设置 进入设置->接口设置 将实时播放音视频流实时录制音视频流两个开关打开,如下图:

  4. 设置服务器域名 进入设置->开发设置 服务器域名里添加以下域名:

  • https://api.yun.vhall.com
  • https://t-open.e.vhall.com
  • https://t-dc.e.vhall.com
  • https://t-gslb-open.e.vhall.com
  • https://gslb.vhallyun.com
  • https://api.vhallyun.com

如下图所示:

三.开发工具准备

四.下载Demo源码

点击微吼小程序demo下载

五.载入工程

1. 打开微信开发工具,用微信扫描二维码登录。

2. 选择“小程序项目”

3. 点击“项目目录”右侧下拉框,选择下载下来的微吼小程序demo目录“vhall-miniprogram”

4.载入完成

效果如下图

六. 填入播放参数

1.打开需要更换参数的文件

在微信开发工具的编辑器里,选择pages-> player-> index.data.js文件, 找到roomId和streamUrl,如下图

2. 找到需要播放的参数。

参考微吼服务注册准备的2 - 4步

3. 在pages-> player-> index.data.js文件中填入上一步对应的参数,如下图所示

七.打开直播观看

到此,就可以观看直播效果了

1. 点击微信开发工具的“预览”,用微信扫描二维码。

2. 点击“发起直播按钮”,如下图

直播观看效果图如下:

八.参考文档

小程序使用指南    

打开小程序,进入直播小程序界面,可应用小程序进行直播发起和直播观看,点击右上角按钮可以退出小程序,同时还支持小程序的转发和调试功能。

微信小程序 微信小程序

发起直播

点击界面中的发起直播,进入推流配置页面,依次填写直播码、推流地址和推流方式,填写完毕,点击进入推流,可以开始进行直播

直播码:对应直播房间ID,获取方式参考控制台指南

推流地址:视频推流地址,获取方式参考控制台指南

推流方式:支持选择横屏/竖屏直播,默认为竖版

发起直播

直播过程中点击返回可结束直播。

发起直播

观看直播

点击界面中的发起直播,进入直播观看配置页面,依次填写appid、accountid、roomid、token、观看方式,填写完毕,点击观看视频可以进行视频观看。

参数获取方式参考快速开始

发起直播

Demo使用指南    
发起直播    
iOS Demo    

1 下载地址

https://github.com/vhall/VHYun_SDK_iOS

2 填写 app_id

进入 iOS SDK Demo,弹出输入 app_id 对话框,对话框中填写应用管理页面获取到的 app_id

3 设置

点击设置,进入设置页面,可进行基础设置和推流设置

基础设置:填写 第三方用户ID third_party_user_id (是开发者自有用户系统里用户的唯一标识),以下简称 third_party_user_id ,详情参考:第三方用户ID(third_party_user_id)是什么?

推流设置:填写获取的 room_idaccess_token 值,其他为默认值,可依照需求进行修改

Android Demo    

1 下载地址

https://github.com/vhall/VHYun_SDK_Android

2 填写 app_id 和 third_party_user_id

进入Android SDK Demo,在界面中输入控制台应用管理中获取的 app_id。然后填入 third_party_user_id (备注:这里的 third_party_user_id 指的就是下图中的 用户id )如果你不清楚 third_party_user_id 是什么,详情参考:第三方用户ID(third_party_user_id)是什么? 具体操作如下图:

3 发起直播

操作界面中填写通过控制台或接口获取到的 room_id 和通过接口获取到的 access_token 值,点击发直播即可发起直播,具体操作如下图:

JS Demo    

1 演示地址

https://static.vhallyun.com/jssdk/vhall-jssdk-live-stream/test/demo.html

2 接口配置

接口配置页面依次输入 app_id(应用ID)、room_id(直播房间ID)、accountId(第三方用户ID:开发者自有用户系统里用户的唯一标识),详情参考:第三方用户ID(third_party_user_id)是什么?、token(access_token),点击保存,跳转至推流页面。

推流设置

3 推流

进入推流页面点击设置按钮,弹出推流设置,设置信息包含摄像头、麦克风、分辨率和音量,不设置则使用系统默认值。

设置完成点击确定,设置成功,此时点击推流,即可发起直播。

*注:推流还可通过点击页面的推流演示,不进行接口设置,直接进入推流页面,完成设置后,点击推流,发起直播。

推流1

推流2 推流3

观看直播    
iOS Demo    

1 下载地址

https://github.com/vhall/VHYun_SDK_iOS

2 填写 app_id

进入 iOS SDK Demo,弹出输入 app_id 对话框,对话框中填写应用管理页面获取到的 app_id

3 设置

点击设置,进入设置页面,可进行基础设置和看直播设置。

基础设置:填写第三方用户id(是开发者自有用户系统里用户的唯一标识),详情参考:第三方用户ID(third_party_user_id)是什么?

看直播设置:填写获取的 room_idaccess_token 值,其他为默认值,可依照需求进行修改

4 观看直播

设置完成,选择观看直播,即可进行直播观看。

Android Demo    

1 下载地址

https://github.com/vhall/VHYun_SDK_Android

2 填写 app_id 和 用户id

进入 Android SDK Demo,页面中输入控制台应用管理中获取的 app_id 和 用户id(第三方用户id),详情参考:第三方用户ID(third_party_user_id)是什么?,点击进入,进入操作页面。

3 观看直播

操作界面中填写上述方法中获得的 room_idaccess_token 值,点击看直播即可观看直播。

JS Demo    

1 演示地址

https://static.vhallyun.com/jssdk/vhall-jssdk-live/test/player_new.html

2 接口配置

接口配置页面依次输入上述方法中获得的app_id(应用ID)、room_id(直播房间ID)、accountId(第三方用户ID:开发者自有用户系统里用户的唯一标识),详情参考:第三方用户ID(third_party_user_id)是什么?、token(access_token),点击初始化播放器,跳转至观看页面。

初始化观看

  • poster为播放器的封面图链接
  • type可切换为观看点播或直播
  • 点播需要传入recordId

3 观看

进入观看页面即可观看直播或点播

观看中

第三方工具推流教程    

1、获取推流地址、直播码

使用第三方工具进行推流前,需在微吼云获取推流地址、直播码,用户可在直播配置页面获取演示直播间的直播码和推流地址,其他直播间的推流地址和直播码可通过API接口进行查询,具体参考API文档

2、第三方工具推流

第三方工具推流在使用推流地址和直播码时,分为两种类型:

1、分别对应填写微吼云获取的直播码和推流地址,如OBS;

2、填写推流地址+/+直播码,如禾苗LIVE;

下文将分别介绍两种类型工具的推流教程

2.1 OBS推流

1)启用OBS,主界面中点击设定,下拉列表中选择设定,弹出设定对话框

2)设定对话框中选择广播设定,在广播设定界面中将微吼云提供的推流地址去掉直播码部分复制到FMS URL中,直播码复制到播放路径/串码流中,点击确定,地址设置成功。

3)添加来源:选择场景,来源处右键单击鼠标添加来源,选择来源,并针对不同的来源进行配置,配置完成来源添加成功。

:添加视频设备,右键单击来源,选择添加视频捕捉设备

编辑设备名称,点击确定

选择需要的视频和音频设备,点击确定,设备添加完成。

4)开始推流

来源添加完成,OBS主界面点击开始串流,即可进行直播。

2.2 禾苗LIVE推流

1)主界面点击推流,跳转至第三方推流页面

2)第三方推流页面推流地址对话框中输入推流地址

3)开始推流

第三方推流页面点击推流,即可进行直播。

服务定价    

1、计费类型及说明

微吼云直播服务采用后付费方式,即使用服务后扣费的计费方式。您需要先在微吼云账户预先充值,系统会按照不同的功能实时或按天从您的账户余额中扣除实际消费产生的金额。

2、计费方式说明

您可以通过控制台查看微吼云直播服务的实际使用量,具体计费方式如下。

计费项 计费方式 付费方式
直播 按峰值带宽/按流量 后付费
直播转码 按时长 后付费
直播录制 按存储 后付费

2.1 直播基础计费

使用直播服务会产生流量或者带宽的费用。流量和带宽均按照下行数据计费,即根据观看直播产生的流量或者带宽计费,上行推流不计费。

2.1.1 直播流量计费

计费规则

按直播观看产生的下行流量计费,实时进行扣费,按照实时消耗的流量乘以单价计费。

计费项 价格(元/GB) 付费方式
直播流量 1.5 后付费

计费周期

实时扣费,每个小时生成消费明细,按自然月出账单,每个月的账单会在次月 1 号生成。

计费公式:

下行流量消耗(GB) * 下行流量单价(元/GB)

计费示例:

直播观看产生的累计流量消耗为 2G,则收费为 2G * 1.5 = 3 元

流量消耗示例:

一场直播流量消耗=(直播码率/8)*直播时长(秒)*观看人数

例如:直播码率为500kbps,观看人数为100人,直播时长为30分钟,则消耗的流量约为:11.25G。

计算方法: (500/8)*30*60*100=11250000K

11250000/1000/1000=11.25G

计算流量为一场直播中人数不发生变化的情况,直播过程中存在人员进入离开的情况,具体数据参考数据统计。

计费说明

1.请确保您的账户余额充足,以免影响您的业务。

2.计费方式如需修改为带宽计费,可联系工作人员,修改完成后次日 0 点生效。

2.1.2 直播带宽计费

计费规则

按当日直播观看产生的全网下行带宽为计费项,按天进行扣费,按照乘以单价计费。

计费项 价格(元/Mbps/日) 付费方式
直播峰值带宽 1.5 后付费

计费周期

按天扣费,按天出消费明细,按自然月出账单,每个月的账单会在次月 1 号生成。

计费公式:

峰值带宽(Mbps) * 下行带宽单价(元/Mbps/日)

计费示例

当天产生的带宽峰值为 200Mbps,则收费为 200 * 1.5 = 300 元

带宽消耗示例

一场直播带宽消耗=直播码率*直播观看人数

例如:直播码率为500kbps,观看人数为100人,则消耗的带宽约为:50Mbps。

计算方法: 500*100=50000Kbps,50000/1000=50Mbps

计费带宽为所有并发直播带宽消耗的总和。

计费说明

1.日结带宽计费点为当天带宽峰值,如果直播业务带宽存在较明显峰值,可能会收取较高的费用,此时建议使用流量计费方式。

2.按天进行扣费,请确保账户余额充足,以免影响您的业务。

3.计费方式如需修改为流量计费,可联系工作人员,修改后次日0点生效。

2.2直播增值服务计费

使用直播增值服务会产生相应的费用,目前直播需要计费的增值服务有:录制、转码。

2.2.1 直播录制费用

按点播存储计费,具体计费规则参考点播存储定价。

2.2.2 直播转码费用

计费规则

完成一次直播转码后进行扣费,按照实时转码的时长乘以单价计费,时长精确到分钟,不足一分钟的不计入计费。

计费项 价格(元/分钟) 付费方式
转码时长 0.08 后付费
  • 注意:多码率场景下,您可以添加多条线路(2~3条),例如其中有N条线路涉及转码计费,则价格为N*0.08元/分钟。

计费周期

按照一次直播转码完成扣费,按小时出消费明细,按自然月出账单。每个月的账单会在次月1号生成。

计费公式:

转码时长(分钟) * 转码单价(元/分钟)

*注:转码时长等于直播时长

计费示例

当转码时长为 100 分钟,则收费为 100 * 0.08 = 8 元

  • 有N路转码流直播:总时长 = 所有直播流的转码时长之和。

计费说明

1.功能默认关闭,可在微吼云控制台手动开启。

2.使用转码功能会相应的收取转码费用。

3.按照一次直播转码完成进行扣费,请确保账户余额充足,以免影响您的业务。

3、欠费说明

1.欠费后工作人员会与您进行联系,如还未进行充值,将会停掉您的服务。

2.开通策略:账户充值余额为正后则会自动开通服务。

常见问题    
使用问题    

1、 后台应用配置完成了,如何单独添加直播活动?

创建应用后会自动开通直播服务并创建演示直播间,其他直播间可通过接口创建。接口参考链接:http://www.vhallyun.com/document/detail/index?project_id=40&doc_id=1015

2、 创建房间是创建聊天室还是视频直播?

创建的是视频直播,也就是直播间。

3、 Roomid就是直播码么?

直播码对应的也是房间ID即Roomid。

4、 视频直播支持哪些推流协议?

支持RTMP推流,即实时消息传输协议,Real Time Messaging Protocol,是 Adobe 公司开发的一个基于 TCP 的应用层协议,目前国内的视频云服务都是以 RTMP 为主要推流协议。

RTMP 推流的地址可通过控制台获取,也可通过接口查询进行获取。

5、 如何使用第三方工具进行推流?

参考第三方工具推流教程,参考链接: http://www.vhallyun.com/document/detail/index?project_id=36&doc_id=858

6、 如何禁止直播推流?

用户可通过控制台/接口关闭直播房间,关闭后房间将无法继续推流;关闭的直播房间可通过控制台/接口进行直播房间启用,开启后可恢复直播推流。

7、 如何进行直播观看?

目前支持在后台查看直播流状态,预览直播画面。也可以通过集成SDK,通过移动端、web端播放器进行直播观看,同时还支持开发小程序,通过小程序进行观看。

8、 如何设定不同清晰度的直播?

微吼云提供转码功能,可以按照系统提供720P、480P、360P、音频几种转码规格进行转码设置。

转码设置 分辨率 码率 格式
720P 720P 650kb --
480P 480P 450kb --
360P 360P 330kb --
音频 -- 原码率 AAC

9、 如何进行直播录制?

通过控制台/接口进行直播录制开启,由于直播录制的内容是保存在点播中的,所以在开启直播录制服务前,请先保证开通点播服务。直播结束后,可通过生成点播接口生成对应的回放视频,生成的点播文件存储在微吼云,并可通过接口/控制台对视频文件进行管理操作。

10、 直播录制产生的回放是否存在观看次数限制?

观看视频没有访问次数限制。

11、 如何解决直播卡顿问题?

影响直播卡顿的因素包括,直播源处理能力、上传网络稳定性、播放端所在设备处理能力、播放端所在网络稳定性等。 您可以通过以下方式解决直播卡顿现象:

  • 改变直播源编码参数
  • 减少上传码率
  • 改变上传网络环境
  • 改变播放端设备配置
  • 改变播放端网络环境等

如果问题依然存在,请提工单,我们会尽快处理。

12、 视频无法播放,常见原因有哪些?

  • 视频流不存在

对于直播,确保房间未被禁用,而且需要开始推流后,观众才能观看。

  • Token过期

Token过期后,再次进入将无法观看视频。

  • 网络连接异常

确保观众网络连接正常稳定。

如果问题依然存在,请提工单,我们会尽快处理。

13、 如何保护直播安全?

  • 推流认证

为确保推流地址不被非法的占用,防止非法推流,直播服务支持采用token认证方式与有效期限制结合的推流地址,通过修改推流地址有效期,可进行推流地址修改,控制台配置有效期最长支持7天,API配置时对于推流过期时间没有时长限制。

同时提供直播推流权限的access_token,在SDK集成时需要进行token验证,可设置access_token的有效期,有效期最长为1天,最小为1秒。配置权限为推流,权限ID对应的ID值为room_id。

token生成可通过API在线测试工具,也可通过接口的方式。

  • 观看认证

为确保观看安全,提供观看直播权限的access_token,在SDK集成时需要进行token验证,SDK将按您赋予的权限进行相关的权限验证,可设置access_token的有效期,有效期最长为1天,最小为1秒。

token生成可通过API在线测试工具,也可通过接口的方式。

14、 支持哪些直播统计?

为用户提供带宽流量、推流质量监控和观看统计分析几个维度的数据,具体数据信息登陆控制台查看数据信息展示:http://www.vhallyun.com/console/app/index

SDK问题    

1、JS 播放器SDK 中的推流视频回显节点ID是如何产生的?

通过用户自定义

2、JS SDK函数调用和传参、回调是VHPublisher么?

是的

3、JS SDK complete回调里面的console没出来?

监听错误事件,报错,需要部署到SEVER,不支持本地调试,监听事件如下:

VHPublisher.error(function(e){
      console.error('错误码:' + e.code); // 错误码
      console.error('错误信息:' + e.msg); //错误信息
                });

4、JS SDK推流报错如何处理?

1) 检查本地摄像头是否正常

2) 推流实例化的时候,会提示flash权限,需要选择允许

3) 需要为HTTPS协议

5、Js sdk推流报错,错误码:1004 错误信息:推流地址错误,请先初始化,再推流

1) Token值不对,获取不到推流地址会导致提示推流地址错误

2) 关闭房间后再进行推流也会导致提示推流地址错误

6、js sdk初始化配置中的第三方id需要和推流的一样么?

可以不一样,依据业务场景来定义

7、JS SDK直播延时可以优化么?

不考虑平台兼容,延时可以做到3-5秒

计费问题    

1、 如何购买直播服务?

使用微吼云平台服务,需要预先在账户进行充值,账户中心中点击充值,输入充值金额,点击提交,订单完成后完成充值,或者联系您的客户经理。

账户充值链接:http://www.vhallyun.com/console/financing/index

2、 直播服务的计费方式?

直播服务采用后付费的计费方式,计费项包含直播、直播录制、直播转码,直播计费可选择带宽/流量的计费方式,直播录制按照点播存储的方式进行计费,直播转码按照转码时长进行计费。

具体计费方案及示例参考: http://www.vhallyun.com/document/detail/index?project_id=36&doc_id=851

3、 账户余额不足时会进行提醒吗?

用户可在账户中心设置余额提醒,默认为0,低于设置的余额时会通过短信的方式对用户进行提醒,及时充值,确保服务的顺利使用。

4、 欠费后会立刻停止服务吗?

欠费后工作人员会与您进行联系,如还未进行充值,将会停掉您的服务。 开通策略:账户充值余额为正后则会自动开通服务。