阿里云直播、直播录制和点播

news/2025/1/13 7:35:32/

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

需求说明:本项目有三个媒体端,分别是app、微信和pc。下面分别讲述下三个媒体端的场景。

  • app端是给讲师直播用的
  • 微信端是给学员看直播用的
  • pc端是给管理员用的

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

图-1

图-2

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 {@Autowiredprivate 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_doneSystem.out.println("app=="+app);//System.out.println("appname=="+appname);//System.out.println("id=="+id);//System.out.println("ip=="+ip);//171.13.130.227System.out.println("node=="+node);//et2long 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.播放.播放有两种方式,一种是用阿里云播放器,另一种是使用自有、开源播放器

第一种,需要播放凭证(很安全,确保视频不会被盗用)或者播放地址(可以开启鉴权使生成的地址有时效性,相对安全);
第二种只需要播放地址即可


http://www.ppmy.cn/news/364625.html

相关文章

腾讯云云直播、云点播

• 前言 • 一、腾讯云云直播、云点播 • 二、智能编排播控系统 • 1.智能编排播控系统之节目编排 • 2.智能编排播控系统之节目制作 • 3.智能编排播控系统之节目播放 • 三、云直播、云点播的安全能力 • 四、云直播、云点播接入简单 前言 智能编排播…

脑机直播 x 赛博驱魔!瑞云专访揭秘胶囊计划国风科幻神作《终极体验》制作幕后...

2021年11月B站发起了一个以扶持国内动画人为愿景与出发点的特别项目《胶囊计划》&#xff0c;以搭建一条全新的道路探索未来行业的方式。Renderbus瑞云渲染一直十分关注国创动画的发展&#xff0c;刚刚结束的2022年小宇宙计划就是由B站主办瑞云协办的青年动画赛事&#xff0c;胶…

腾讯云云点播 VOD产品概述和产品架构,云点播 VOD提供端到端的一站式音视频点播解决方案

腾讯云云点播 腾讯云点播&#xff08;Video on Demand&#xff0c;VOD&#xff09;基于腾讯多年技术积累与基础设施建设&#xff0c;为有音视频应用相关需求的客户提供包括音视频存储管理、音视频转码处理、音视频加速播放和音视频通信服务的一站式解决方案。腾讯云产品动态 …

非迅雷会员免费看云点播方法,无需软件享官方云点播

请使用最新评论下方的版本&#xff01;大家可以收藏本帖&#xff0c;以后会不定期的更新&#xff0c;所有以别再转载了&#xff0c;低调、低调&#xff01; 迅雷云点播破解脚本&#xff08;Xunlei.Any.Player&#xff09;支持 Chrome、Firefox、Opera、搜狗浏览器及所有基于chr…

腾讯云点播集成

今天公司视频要从CC替换成腾讯云&#xff0c;脑壳疼 但是也要硬着脑壳上 首先先把腾讯云视频超级播放器集成到项目里&#xff01; 1、登陆腾讯云视频官网&#xff0c;下载sdk开发包 2、我使用的是导入源码的方式&#xff0c;方便修改需求。如果不需要的话也可以直接导入aar包方…

【项目】视频点播系统

目录 一、项目介绍1. 对视频点播系统的认识2. 服务端功能模块划分 二、环境搭建2.1 升级GCC2.2 安装JsonCpp库2.3 引入httplib库2.4 MySQL数据库及开发包安装 三、第三方库的认识3.1 认识JsonCpp3.2 JsonCpp实现序列化3.3 JsonCpp实现反序列化3.4 认识MySQL数据库的API3.5 使用…

■ 直接调用阿里云视频点播API实现视频播放

前言&#xff1a;公司最近要实现一个视频播放的功能&#xff0c;正常是不需要移动端调用阿里云视频API的&#xff0c;这件事是由后台来完成的。但是既然需求交给我了&#xff0c;就要想办法完成。 先来看一眼官方的API调用文档 https://help.aliyun.com/document_detail/44435…

React高级特性解析

react conText 使用API React.createContext 返回的是组件对象 可以利用结构的方式 第一种方式 使用Provider包裹的组件都可以获取提供者的value Context.Consumer 组件里面使用函数 函数返回一个组件 函数的参数为Context初始化的参数 第二种方式 使用Context.Provider包…