近来公司有个直播类的项目,让我调研下阿里云直播,花了3、4天调研结束后,做下笔记,一方面自己日后便于查看,另一方面与大家做个交流,有说的不正确的。欢迎指正。

需求说明:本项目有三个媒体端,分别是app、微信和pc。下面分别讲述下三个媒体端的场景。 
- app端是给讲师直播用的 
- 微信端是给学员看直播用的 
- pc端是给管理员用的

下面介绍下阿里云的直播使用: 
1.在app端需要推流到阿里云cdn,需要应用服务器生成一个推流地址(有推流地址就能拼出拉流地址),且配置回调监听推流状态.(如图-1所示) 
2.在微信端需要拉流地址(直播地址),需要从应用服务器拿到拉流地址 
3.配置直播录播转点播后,直播推流中断三分钟后,直播的视频会被传输到点播,此时配置一个回调地址(针对两种情况进行回调,如图-2所示) 
a.直播视频已经被传输到点播(注意:此时已经得到videoid,但是视频还在转码,还是无法播放) 
b.传输到点播的视频已经转码成功(此时可以播放视频了)

package com.yx.tsing.course.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.yx.tsing.common.ConsHint;
import com.yx.tsing.common.Constant;
import com.yx.tsing.common.result.JsonPageResult;
import com.yx.tsing.common.result.JsonResult;
import com.yx.tsing.course.domain.Course;
import com.yx.tsing.course.service.CourseService;
import com.yx.tsing.course.vo.*;
import com.yx.tsing.utils.AliUtil;
import com.yx.tsing.utils.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;
import tk.mybatis.mapper.entity.Example;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.MessageFormat;
import java.util.Date;

/**
 * create by zml on 2018/3/6 16:52
 */
@RestController
@RequestMapping("/course")
public class CourseController {

@Autowired
    private CourseService courseService;

@Value("#{configProperties['live.appName']}")
    private String appName;

@Value("#{configProperties['live.streamName']}")
    private String streamName;

@Value("#{configProperties['live.vhost']}")
    private String vhost;

@Value("#{configProperties['live.key']}")
    private String key;

/**
     * 根据课程id拿到推流地址
     * @param id
     * @throws Exception
     */
    @RequestMapping(value = "/pushUrl")
    public JsonResult pushUrl(long id) {
        //传入自定义参数,即传入应用名称和流名称
//        String AppName = "tsonline";
        String StreamName = streamName +"_"+id;
//        String vhost = "live.ayxsoft.top";
        //时间戳,有效时间
        long time = System.currentTimeMillis() + 1800;
        //加密key,即直播后台鉴权里面自行设置
//        String key = "qreVeWGNRC";
        String strpush = "/" + appName + "/" + StreamName + "-" + time + "-0-0-" + key;
        // 里面的直播推流中心服务器域名、vhost域名可根据自身实际情况进行设置
        String pushurl = "rtmp://video-center.alivecdn.com/" + appName + "/" + StreamName + "?vhost=" + vhost + "&auth_key=" + time + "-0-0-" + MD5Util.getMD5(strpush);
//        $strviewrtmp = "/$AppName/$StreamName-$time-0-0-$key";
//        $strviewflv = "/$AppName/$StreamName.flv-$time-0-0-$key";
        String strviewm3u8 = "/" + appName + "/" + StreamName + ".m3u8-" + time + "-0-0-" + key;

String rtmpurl = "rtmp://" + vhost + "/" + appName + "/" + StreamName + "?auth_key=" + time + "-0-0-" + MD5Util.getMD5(strpush);
//        $flvurl = "http://live1.playzhan.com/$AppName/$StreamName.flv?auth_key=$time-0-0-".md5($strviewflv);
        String m3u8url = "http://" + vhost + "/" + appName + "/" + StreamName + ".m3u8?auth_key=" + time + "-0-0-" + MD5Util.getMD5(strviewm3u8);
        //打印推流地址,即通过鉴权签名后的推流地址
        System.out.println("推流地址== " + pushurl);
        //打印三种直播协议播放地址,即鉴权后的播放地址
        System.out.println("播放地址rtmp PushUrlVo==" + rtmpurl);
//        echo $flvurl.'<br>';
        System.out.println("播放地址m3u8url==" + m3u8url);

//保存播放地址到数据库
        courseService.playUrl(id,rtmpurl+";"+m3u8url);

return new JsonResult(true,"success!",new PushUrlVo(pushurl));
    }

/**
     * 阿里云直播平台通知用户当前域名推流状态,例如推流成功或者断流
     * 中心推流回调(判断课程是否在直播)
     * @throws Exception
     */
    @RequestMapping(value = "/pushCallBack")
    public void pushCallBack(@RequestParam(value = "action",defaultValue = "",required = false) String action,
                             @RequestParam(value = "app",defaultValue = "",required = false) String app,
                             @RequestParam(value = "appname",defaultValue = "",required = false) String appname,
                             @RequestParam(value = "id",defaultValue = "",required = false) String id,
                             @RequestParam(value = "ip",defaultValue = "",required = false) String ip,
                             @RequestParam(value = "node",defaultValue = "",required = false) String node) {
        System.out.println("action=="+action);//publish和publish_done
        System.out.println("app=="+app);//
        System.out.println("appname=="+appname);//
        System.out.println("id=="+id);//
        System.out.println("ip=="+ip);//171.13.130.227
        System.out.println("node=="+node);//et2

long courseId = Long.valueOf(id.split("_")[1]);
        int type = 1;
        if("publish".equals(action)){
            type = 2;
        }else if("publish_done".equals(action)){
            type = 3;
        }
        courseService.setType(courseId ,type);
    }

/**
     * 1.开启直播录制到点播后,当完成一个录制周期或直播流结束时会生成一个点播视频,此时阿里云点播平台会回调此接口
     * 2.视频在点播平台转码成功会回调此接口
     * 点播回调
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping(value = "/playCallBack")
    public void callBack(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String c_length=request.getHeader("content-length");
        int c_i=Integer.parseInt(c_length);
        //解析阿里回调服务器的接口数据
        String result = AliUtil.GetPostBody(request.getInputStream(), c_i);
        System.out.println("resultCallBack=="+result);

JSONObject jsonObject = JSON.parseObject(result);
        String EventType = jsonObject.getString("EventType");
        String Status = jsonObject.getString("Status");
        if("AddLiveRecordVideoComplete".equals(EventType)){ //第一种情况,直播录制转点播成功
            if("success".equals(Status)){
                //保存返回来的文件信息
                //{"Status":"success","VideoId":"e5524b741330406c99e08698433dd387","StreamName":"StreamName_1","RecordStartTime":"2018-03-06T07:51:38Z","EventType":"AddLiveRecordVideoComplete","DomainName":"live.ayxsoft.top","RecordEndTime":"2018-03-06T07:53:47Z","UserId":1023641609718688,"EventTime":"2018-03-06T07:56:47Z","AppName":"tsonline"}
                String videoId = jsonObject.getString("VideoId");
                String StreamName = jsonObject.getString("StreamName");
                long courseId = Long.valueOf(StreamName.split("_")[1]);

Course course = new Course();
                course.setId(courseId);
                course.setType(3);
                course.setRecordPath(videoId);
                course.setUpdateTime(new Date());
                courseService.updateByPrimaryKeySelective(course);
                //返回给点播服务器
                AliUtil.response(request, response, "{\"Status\":\"OK\"}", HttpServletResponse.SC_OK);
            } else {
                AliUtil.response(request, response, "{\"Status\":\"verdify not ok\"}", HttpServletResponse.SC_BAD_REQUEST);
            }

}else if("TranscodeComplete".equals(EventType)){//第二种情况,视频在点播平台转码成功
            if("success".equals(Status)){
                //保存返回来的文件信息d
                //{"VideoId": "43q9fjasjdflask","Status": "success","StreamInfos":[],"EventTime": "2017-03-20T07:49:17Z","EventType": "TranscodeComplete"}
                String videoId = jsonObject.getString("VideoId");
                String status = jsonObject.getString("Status");

if("success".equals(status)){
                    Example example = new Example(Course.class);
                    Example.Criteria criteria = example.createCriteria();
                    criteria.andEqualTo("recordPath",videoId);
                    criteria.andEqualTo("type",3);//只考虑 直播录播到点播转码成功 的情况

Course course = new Course();
                    course.setType(4);
                    course.setUpdateTime(new Date());
                    courseService.updateByExampleSelective(course,example);
                }

//返回给点播服务器
                AliUtil.response(request, response, "{\"Status\":\"OK\"}", HttpServletResponse.SC_OK);
            } else {
                AliUtil.response(request, response, "{\"Status\":\"verdify not ok\"}", HttpServletResponse.SC_BAD_REQUEST);
            }
        }

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
下面介绍下阿里云的点播使用: 
1.上传,上传时需要请求应用服务器拿到上传权限和上传地址 
2.播放.播放有两种方式,一种是用阿里云播放器,另一种是使用自有、开源播放器

第一种,需要播放凭证(很安全,确保视频不会被盗用)或者播放地址(可以开启鉴权使生成的地址有时效性,相对安全); 
第二种只需要播放地址即可
--------------------- 
作者:haohao123nana 
来源:CSDN 
原文:https://blog.csdn.net/haohao123nana/article/details/79481802?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

阿里云直播、直播录制和点播相关推荐

  1. 阿里云CDN直播架构与双11晚会直播实战

    摘要: 分享人:阿里云CDN直播 高级技术专家 阙寒分享内容:双11直播活动是众多直播活动中非常典型的场景,离不开直播本身这个话题.所以今天的分享会从直播概述.直播架构.业务功能.直播监控.双11这几 ...

  2. 阿里云CDN直播架构与双11晚会直播实战 1

    摘要: 分享人:阿里云CDN直播 高级技术专家 阙寒分享内容:双11直播活动是众多直播活动中非常典型的场景,离不开直播本身这个话题.所以今天的分享会从直播概述.直播架构.业务功能.直播监控.双11这几 ...

  3. 阿里云视频直播使用详细步骤

    目录 一.阿里云视频直播 1.什么是视频直播 2.视频直播架构 3.官方文档链接 二.使用流程 1.使用条件 2.添加推流域名和播流域名 3.配置CNAME 4.关联推流域名和播流域名 5.生成推流地 ...

  4. 深度解读:阿里云视频直播功能升级

    2022年注定是体育超级大年,冬奥.亚运会.大运会.世界杯等各类大型体育赛事应接不暇.随之而来便是各类赛事直播,客户对直播服务要求变得越来越高,视频直播技术创新显得格外重要.如何利用直播技术创新降低线 ...

  5. java SpringBoot 集成 阿里云视频直播 完成直播功能

    经历了几天的周折,近期才把项目完成,在这里与大家分享一下踩坑之路,也方便日后有类似项目,可以借阅一番 开发直播前先满足已下条件 1.开通视频直播功能 2.购买好了OSS存储 3.购买两个域名并且备案好 ...

  6. 阿里云视频直播PHP-SDK

    阿里云 视频直播 配置 及 PHP-SDK 接入教程 准备工作 域名管理 配置鉴权 地址生成器及DEMO演示-熟悉鉴权 接入SDK 推流回调的配置 阿里云 视频直播 配置 及 PHP-SDK 接入教程 ...

  7. 阿里云视频直播产品使用流程

    1 阿里云视频直播使用流程 1.1 域名配置,及CNAME映射 开通视频直播,开通服务免费,产生的流量付费: 1.1.1 开通后,进入管理控制台: 使用阿里云视频直播,必须有一个审核通过的域名.没有的 ...

  8. 阿里云视频直播服务获取签名

    阿里云视频直播服务获取签名,试了一万次,最后还是催工单了,好尴尬 直接上代码 package com.zjy.xzlive.util;import org.apache.commons.codec.b ...

  9. java SpringBoot 集成 阿里云视频直播 完成直播功能

    经历了几天的周折,近期才把项目完成,在这里与大家分享一下踩坑之路,也方便日后有类似项目,可以借阅一番 该项目是一个H5直播,采用m3u8格式完成直播的展示.通过推流地址,借助第三方推流工具实现直播效果 ...

  10. 首批唯一!阿里云视频直播服务获信通院首批唯一认证

    简介:阿里云视频直播服务 7 月 28 日,由中国信息通信研究院主办的 2021 可信云大会上,阿里云凭借在视频直播 "云 - 边 - 端" 的产品技术优势,以最高标准通过了可信云 ...

最新文章

  1. Python_note2 基本图形绘制+turtle库使用
  2. 事务-07-微服务架构的设计模式
  3. 一种神经元探索系统方法及装置
  4. Swift - 使用set,get确保索引加减在正常的范围内
  5. 恒生java开发复试_2019恒生电子面试经验(JAVA开发人员,实施工程师等)
  6. aria2的安装与配置
  7. 大功率无线数传设备不接天线有何影响?
  8. mysql 创建查询 删除_MYSQL数据库查询删除创建企业基本知识
  9. https被修改成http排查过程
  10. linux删除win分区工具,Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复...
  11. [论文笔记]Augmented SBERT: Data Augmentation Method for Improving Bi-Encoders for Pairwise Sentence
  12. Atitit 读取文本文件内容功能的实现 艾提拉 总结 attilax总结 1.1. FileUtilsAti.readFileToStringAutoDetectEncode(txtF); 1 1
  13. 《随笔二十二》—— C++中的“ 函数模板 和 类模板 ”
  14. ps批处理图片小技巧
  15. 《Excel高手捷径:一招鲜,吃遍天》一第29招 Excel 文件“减肥瘦身”秘诀
  16. 经纬度换算数值_如何在Excel中将经纬度数值转换成度分秒
  17. 周易六十四卦——水风井卦
  18. rstudio 修改代码间距_R语言入门:使用RStudio的基本操作
  19. php 发微博实例,基于PHP实现发微博动态代码实例
  20. 网络优化之net.ipv4.tcp_tw_recycle参数

热门文章

  1. 连续Hopfield神经网络的优化旅行商问题
  2. 钰泰DCDC降压料号,中低降压市场领域应用广泛,ETA1652/ETA3456/ETA1753
  3. 弯管机编程软件电脑版_汇川HMI编程软件(InoTouch Editor)
  4. 随机存取存储器SRAM
  5. Google Earth Engine(GEE) ——土著土地地图数据集
  6. Python批量清除目录结构保留文件
  7. ViewPager底部添加小圆点
  8. 突发!美团王兴躬身入局,AI大模型赛道还有谁?
  9. 鸿蒙系统1007鸿蒙系统,1007 燃爆 | 华为“鸿蒙”真的来了!看完这些商标来历,网友们又激动了...
  10. 如何绕过开机密码开启计算机,win10系统怎么绕过开机密码_win10系统绕过开机密码的两种方法...