iPad版“讲课啦”APP使用教程(视频)

视频说明

保利威讲课啦 APP,随时随地开启教学直播,现在我们就来体验一下。

在iPad上安装保利威讲课啦,使用频道号和密码登录。
登录成功后,先进行一下基本设置,根据实际需求,选择相应的选项,都设置完成之后,点击保存就可以了。
在开始直播之前,先在后台对应的频道号下,上传课程PPT文档,上传成功之后,在iPad文档管理,选择我们上课用的文档,点一下,ppt内容就出现在画面上啦,点击上课,就开始直播教学了。老师客户端摄像头默认是开启的,如果不想开启,可以点击摄像头小图标可关闭摄像头。
在讲课过程中,可以滑动画面左右翻页,也可以点击ppt下方的箭头翻页,还可以通过快速导航的预览小图跳转页面。
工具栏,选择画笔,画笔颜色和笔触大小都可以根据需要进行选择;如果画错了,可以使用橡皮擦擦除错误的笔迹,如果想清除当前页面上所有的笔迹,点一下清空按钮就可以了。
在上课过程中,可以使用白板对知识点进行讲解;
在连线这里,开启视频或音频连线,这时候,学员可以申请连线,点击允许,就可以跟学员进行实时互动了,视频连麦最多可支持6名学员同时在线。右边的聊天区,可以跟学员聊天互动,一对一答疑,提升学员学习积极性,活跃课堂气氛。最后,可以点击右上角分享按钮,通过直播链接或二维码的方式,将直播地址分享给学员。
好了,今天就介绍到这里,感谢您的观看,我们下次再见。

 

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

如何实现嘉宾连麦功能(视频)

视频说明

保利威嘉宾连麦功能,可以实现多个老师同时讲一门课,解决了异地老师时间和差旅费用的问题。

那怎么使用嘉宾连麦功能呢?
第一步:确保使用的直播场景为三分屏,可以在直播详情,直播场景这里设置。
第二步:在直播在直播后台角色管理中,点击增加嘉宾,后台会生成一个嘉宾号和对应的密码,点击设置,可以修改嘉宾头像,昵称,头衔和密码,设置完成之后,点击确认保存即可。这里最多可以添加6个嘉宾。
第三步,讲师或主持人使用云课堂发起直播,在基本设置,混流布局这里,有三种布局模式,按照实际需求选择多人模式或者主讲模式,我们选择主讲模式。
第四步,嘉宾使用嘉宾号和密码登录polyv云课堂客户端,主持人点击上课按钮,就可以开始直播了。
最后,点击嘉宾头像的右上角,可以切换主讲的嘉宾,主持人还可以禁用嘉宾的麦克风或者摄像头画面。

以嘉宾A为例,A使用嘉宾账户和密码登录后,会自动上麦,默认在主位置,当主持人切换A为主讲时,A 会在所有客户端的主位置,同时,A的客户端也会收到这样的提示:您已被授予讲师权限。当主持人切换B嘉宾为主讲模式,这时,A客户端会显示“您的讲师权限已被收回”。

 

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

添加菜单

接口URL

http://api.polyv.net/live/v3/channel/menu/add

接口说明

1、作用:添加一个频道菜单
2、接口支持https协议

支持格式

JSON

请求方式

POST

请求数限制

TRUE

请求参数

参数名 必选 类型 说明
appId string 从API设置中获取,在直播系统登记的appId
timestamp string 当前时间的秒级时间戳(13位)
sign string 签名,为32位大写的MD5值
channelId int 频道号
name string 菜单名称
type string 菜单类型
desc 直播介绍
chat 互动聊天
quiz 咨询提问
text 图文菜单
iframe推广外链
content string 菜单内容。
当菜单类型为直播介绍、图文菜单时,该值为菜单的内容。
当菜单类型为外链推广时,该值为外链链接地址。

操作成功响应示例

{
  "code": 200,
  "message": "",
  "data": {
    "menuId": "3b650cf438",
    "menuType": "iframe",
    "name": "推广菜单",
    "ordered": 6,
    "content": "http://polyv.net"
  }
}

操作失败响应示例

签名错误

{
    "code": 403,
    "status": "error",
    "message": "invalid signature.",
    "data": ""
}

缺少参数

{
    "code": 400,
    "status": "error"
    "message": "param should not be empty: name",
    "data": ""
}

参数长度过长

{
    "code": 400,
    "status": "error"
    "message": "param length is incorrect: name",
    "data": ""
}

菜单类型错误

{
    "code": 400,
    "status": "error"
    "message": "invalid menu type",
    "data": ""
}

已存在该类型的菜单(除 text、iframe 类型外,其他菜单都具有唯一性,重复添加相同类型时会返回错误)

{
    "code": 400,
    "status": "error"
    "message": "menu already exist",
    "data": ""
}

菜单数已达到上限(“咨询提问”之外,最多可以有6个菜单)

{
    "code": 400,
    "status": "error"
    "message": "menu count reached the limit",
    "data": ""
}

响应字段说明

名称 类型 说明
code string 响应代码,成功为200,失败为400,签名错误为401,异常错误500
status string 成功为success,失败为error
message string 错误时为错误提示消息
menuId string 菜单ID
menuType string 菜单类型
desc 直播介绍
chat 互动聊天
quiz 咨询提问
text 图文菜单
iframe推广外链
name string 菜单名称
ordered string 菜单顺序,值越小,越靠前。新添加的菜单默认位于最后。
content string 菜单内容

php请求示例

<?php
//引用config.php
include 'config.php';

$params = array(
  'appId' => $appId,
  'timestamp' => $timestamp,
  'channelId' => '123456',
  'name' => '菜单名称',
  'type' => 'text',
  'content' => '菜单内容'
);

//生成sign
$sign = getSign($params); //详细查看config.php文件的getSign方法

$params["sign"] = $sign;
$url="http://api.polyv.net/live/v3/channel/menu/add?".http_build_query($params);

function post($url, $post_data = '', $timeout = 5){
   $ch = curl_init();
   curl_setopt ($ch, CURLOPT_URL, $url);
   curl_setopt ($ch, CURLOPT_POST, 1);
   if($post_data != ''){
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
   }

   curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
   curl_setopt($ch, CURLOPT_HEADER, false);
   curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($post_data)));
   $file_contents = curl_exec($ch);
   curl_close($ch);
   return $file_contents;
}

echo post($url);
?>

java请求示例

package com.live;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.live.util.EncryptionUtils;

public class Demo {


    private static RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(15000)
            .setConnectionRequestTimeout(15000).build();

    public static void main(String[] args) {

        String url = "http://api.polyv.net/live/v3/channel/menu/add";
        String appId = "appId";
        String key = "secretKey";
        Map<String, String> map = new HashMap<>();
        map.put("appId", appId);
        map.put("timestamp", String.valueOf(System.currentTimeMillis()));
        map.put("channelId", "123456");
        map.put("name", "菜单名称");
        map.put("type", "text");
        map.put("content", "菜单内容");

        String sign = getSign(map, key);
        map.put("sign", sign);

        String body = "";
        String content = sendHttpPost(url, map, body);
        System.out.println(content);

    }

    /**
     * 发送 post请求
     * @param httpUrl 地址
     * @param maps 参数
     */
    public static String sendHttpPost(String httpUrl, Map<String, String> maps, String body) {
        StringBuilder url = new StringBuilder();
        url.append(httpUrl).append("?");
        for (Map.Entry<String, String> map : maps.entrySet()) {
            url.append(map.getKey()).append("=").append(map.getValue()).append("&");
        }
        String urlStr = url.toString().substring(0, url.length() - 1);

        System.out.println(urlStr);
        // 创建httpPost
        HttpPost httpPost = new HttpPost(urlStr);
        try {
            StringEntity entity = new StringEntity(body, Charset.forName("UTF-8"));
            httpPost.setEntity(entity);
        } catch (Exception e) {
            // ...
        }
        return sendHttpPost(httpPost);
    }

    /**
     * 发送Post请求
     * @param httpPost
     * @return
     */
    private static String sendHttpPost(HttpPost httpPost) {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        HttpEntity entity;
        String responseContent = null;
        try {
            // 创建默认的httpClient实例.
            httpClient = HttpClients.createDefault();
            httpPost.setConfig(requestConfig);
            // 执行请求
            response = httpClient.execute(httpPost);
            entity = response.getEntity();
            responseContent = EntityUtils.toString(entity, "UTF-8");
        } catch (Exception e) {
            // ...
        } finally {
            try {
                // 关闭连接,释放资源
                if (response != null) {
                    response.close();
                }
                if (null != httpPost) {
                    httpPost.releaseConnection();
                }
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                // ...
            }
        }
        return responseContent;
    }

    /**
     * 根据map里的参数构建加密串
     * @param map
     * @param secretKey
     * @return
     */
    protected static String getSign(Map<String, String> map, String secretKey) {
        Map<String, String> params = paraFilter(map);
        // 处理参数,计算MD5哈希值
        String concatedStr = concatParams(params);
        String plain = secretKey + concatedStr + secretKey;
        String encrypted = EncryptionUtils.md5Hex(plain);

        // 32位大写MD5值
        return encrypted.toUpperCase();
    }

    /**
     * 对params根据key来排序并且以key1=value1&key2=value2的形式拼接起来
     * @param params
     * @return
     */
    private static String concatParams(Map<String, String> params) {
        List<String> keys = new ArrayList<>(params.keySet());
        Collections.sort(keys);

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = params.get(key);

            sb.append(key).append(value);
        }

        return sb.toString();
    }

    /**
     * 除去数组中的空值和签名参数
     * @param sArray 签名参数组
     * @return 去掉空值与签名参数后的新签名参数组
     */
    private static Map<String, String> paraFilter(Map<String, String> sArray) {

        Map<String, String> result = new HashMap<>();

        if (sArray == null || sArray.size() <= 0) {
            return result;
        }

        for (String key : sArray.keySet()) {
            String value = sArray.get(key);
            if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
                    || key.equalsIgnoreCase("sign_type")) {
                continue;
            }
            result.put(key, value);
        }

        return result;
    }
}

签名规则(config.php文件代码查看)

http://dev.polyv.net/2018/liveproduct/l-api/rule/sign/

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

暖场设置

1.方法一:登录保利威视管理系统首页(http://my.polyv.net/v2/login
我的直播-->频道设置-->暖场设置

频道设置暖场设置1

方法二:直接登录频道号登录入口(http://live.polyv.net/teacher/login.htm),
暖场设置

二.功能介绍

  • 暖场设置类型分为视频和图片,默认视频类型
  • 设置的暖场内容,在讲师推流前播放,有助于缓解气氛

三.使用步骤

暖场开关开启-->选择暖场类型
- 当类型为视频时,视频地址获取方式:
1.找到一个完整的视频,例如:v.polyv.net/uc/video/getMp4?vid=a98c9950bd487ea4fd0661492573155d_a_8

2.把等号后面的改为你要的视频的ID
暖场设置2
即v.polyv.net/uc/video/getMp4?vid=红色框框部分

3.复制到浏览器中打开,可观看到完整视频,复制视频地址,如下
暖场设置6
- 当当类型为图片时:上传建议尺寸、大小、格式的图片,以及点击图片跳转的链接
暖场设置3

注意:

1)目前只支持MP4格式的暖场视频,视频大小不超过30M;

2)等待图片和暖场视频功能,两者只能选其中之一。

暖场设置2暖场设置3

 

2.效果图如下:
暖场视频效果图

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

推广

一.功能路径

我的直播-->频道设置-->营销设置-->推广

频道设置推广

二.功能介绍

推广2

  1. 推广功能开关:打开后移动端观看页将打开关注企业公众号入口
  2. 入口文案:修改关注公众号入口的文字
  3. 公众号二维码:公众号二维码上传(目前只支持不大于200k、格式为jpg、png的二维码)
  4. 弹窗提示文案:文案显示在二维码下方
  5. 主动弹窗开关:打开后观众进入观看页后二维码自动弹出
  6. 移动端页面效果预览
  7. 确认保存按钮

三.移动端观看页效果

推广3

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

角色管理

一.功能路径

我的直播-->频道设置-->角色管理

角色管理1角色管理2

二.功能介绍

角色管理分为两部分:讲师管理、助教管理
角色管理3

讲师设置:
角色管理4

  1. 讲师设置:可修改讲师头像、讲师昵称、讲师头衔以及讲师密码,修改后点击”确认保存“成功修改
  2. 讲师链接:跳转到启动客户端页面

助教设置:
角色管理5

  1. 创建子频道:点击后新增子频道号
  2. 助教链接:跳转至助教登录页
  3. 打开导播台
  4. 设置:可修改助教头像、助教昵称、助教头衔、助教密码以及助教权限
  5. 删除:删除单个子频道号
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

图文直播

一.功能路径

我的直播-->频道设置-->图文直播

图文直播1图文直播2

二.功能介绍

图文直播3图文直播4
1. 图文直播开关:开启后将在观看页出现图文直播TAB
1. 图文发布:图文发布内容的填写
1. 图文设置:图文直播信息的设置(第一张图的标志为设置后相应显示位置)
3.1.上传头像:可更改主持人头像
3.2.直播头衔:可更改图文直播头衔
3.3.直播昵称:可更改图文直播昵称
3.4.确认保存按钮
1. 下载图文:点击后可下载已发布的图文
1. 删除所有:删除所有图文直播内容
1. 图文直播内容展示
1. 添加图片:添加本地图片(目前一次最多可添加9张图片)
1. 发布图文按钮

三.观看页效果演示

图文直播5

可选择图片模式
图文直播6

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

数据统计

一.功能路径

我的直播-->频道设置-->数据统计

数据统计1数据统计2

二.功能介绍

  • 数据统计是以频道号为对象进行的数据统计
  • 数据统计分为:观看详情、日期汇总、地域分布、观看终端、在线人数
    • 观看详情:以频道号为单位统计不同时间段的数据情况
    • 日期汇总:以日期为单位统计一天的观看数据
    • 地域分布:统计不同时间段观看的地域分布,分中国地区已经全球分布
    • 观看终端:统计不同时间的段观看终端,分PC端和移动端
    • 在线人数:统计频道号实时在线人数以及历史在线人数

数据统计3

三.使用步骤

1.观看详情
- 可查看直播观看的详情以及回放观看的详情
- 可合并同一用户
- 可通过时间段、用户ID、用户昵称查询用户观看详情
- 可导出查询数据

数据统计4

2.日期汇总
- 可选择列表或图表
- 可选择不同的时间段
- 可导出数据

效果图如下
数据统计5数据统计6

3.地域分布
- 可选择不同地区:中国地区、全球分布
- 可选择不同时间段
- 可导出数据

效果图如下
数据统计7

4.观看终端
- 分PC段和移动端
- 可选择时间段
- 可导出数据

效果图如下
数据统计8

5.在线人数

实时在线人数:
- 实时更新2分钟以内的在线人数
- 延迟在10秒左右
- 数据列表缩略图

数据统计9
历史在线人数:
- 可根据日期查看历史并发人数
- 显示最高并发数的日期以及并发人数
- 导出列表数据
- 并发人数列表缩略图

数据统计10

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

直播内容审核回调功能

作用:

账号下频道直播内容异常(涉黄、涉爆、涉政)违规时触发,将违规频道的相关信息回调给用户

详情:

设置接口地址后,如果账号下频道内容违规时,直播系统会将以下参数channelId(频道号)、imageUrl(图片地址)、scene(违规类型:porn 涉黄, terrorism 暴恐涉政)、rate(结果为该类型的概率) 以 GET 方式提交到给用户自定义的回调接口进行通知,如:
http://abc.com/test.do?channelId=123456&imageUrl=http://xxxx/xxx/xxx.jpg&scene=porn&rate=90.0

参数名 类型 说明
channelId int 频道ID
imageUrl string 违规直播的截图,注意:图片为临时地址,请及时进行处理
scene string 违规类型,取值为porn(涉黄)、terrorism(暴恐涉政)
rate float 结果为该类型的概率,取值为[0.00-100.00],值越高表示越有可能属于该类型的概率

如何设置

通过后台设置

在直播后台中,点击【开发设置】,然后点击【回调设置】,在此进行设置
回调注意: 提交的接口地址必须要以http:// 或者https:// 开头

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...