视频的上传及购买播放

article/2025/8/15 4:18:30

一、上传视频

 

1:使用百度云:

  1. 登录百度云:https://cloud.baidu.com/ 进入管理控制台;
  2. 开通 “视频点播VOD” 服务;
  3. 在后台管理系统 --> 右上角“安全认证” --> 获取 “AccessKey”;
  4. 在 “视频点播VOD” 界面 --> 全局设置 --> 发布设置 --> 安全设置 --> 获取 “UserKey”;

 

2:自定义转码设置:

 

1、视频需经过加密在进行发布,先创建一个编码模板(配置如下):

  1. 容器:选择 HLS(Http Live Streaming);
  2. 编码规格:high高;
  3. 分辨率 (视频码率):1920_1080 (2500) ,2180_720 (1024) ,800*600 (512)等;
  4. 加密策略:Token;

 

 

 

2、进入 媒资管理 进行视频上传,选择 自定义转码模板组

 

 二:视频的播放

 

1、后端代码

 

  1. 获取 ‘tokon’ 的值(参照官方文档:https://cloud.baidu.com/doc/VOD/BestPractise.html#token.E8.AE.A1.E7.AE.97.E8.A7.84.E5.88.99)
     1 # 获取tokon;
     2 def course_token(request):
     3     # video:是视频文件的完整链接
     4     file = request.GET.get('video')
     5     # 过期时间;
     6     expiration_time = int(time.time()) + 2 * 60 * 60
     7 
     8     USER_ID = settings.BAIDU_CLOUD_USER_ID
     9     USER_KEY = settings.BAIDU_CLOUD_USER_KEY
    10 
    11     # file=http://hemvpc6ui1kef2g0dd2.exp.bcevod.com/mda-igjsr8g7z7zqwnav/mda-igjsr8g7z7zqwnav.m3u8
    12     # 先获取扩展名;再通过‘/’分割取最后一个值,并将扩展名替换为空字符串;得到‘ID’;
    13     extension = os.path.splitext(file)[1]
    14     media_id = file.split('/')[-1].replace(extension, '')
    15 
    16     # 将‘USER_KEY’进行编码;后面的‘hmac.new()’只能接受bytes类型;
    17     # unicode->bytes=unicode.encode('utf-8')bytes
    18     key = USER_KEY.encode('utf-8')
    19     message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8')
    20 
    21     # signature:生成签名;
    22     # disgestmod:指定加密方式;
    23     signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest()
    24     token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time)
    25     return restful.result(data={'token': token})

    (url 映射地址:cms/course_token)

 

 

2、前端代码

 

  1. 下载 videojs 文件:http://sdk.bce.baidu.com/media-sdk/Baidu-T5Player-SDK-Web-v3.4.0.zip;
  2. 将 videojs 文件的 js 文件添加到项目文件目录中,以便 HTML模板 引用;
     1 <!-- HTML中需引用的文件 -->
     2     <script src="{% static 'videojs/video.min.js' %}"></script>
     3     <script src="{% static 'videojs/videojs-contrib-hls.min.js' %}"></script>
     4     <script src="{% static 'videojs/videojs-contrib-quality-levels.min.js' %}"></script>
     5 
     6     <!-- 加载播放器 -->
     7     <script type="text/javascript" src="https://cdn.bdstatic.com/jwplayer/latest/cyberplayer.js"></script>
     8 
     9     <!-- 初始化播放器的 js 文件 -->
    10     <script src="{% static 'js/cms/course_detail.min.js' %}"></script>

     

  3. 并创建一个用来加载视频的容器;
    1 <div class="video-group">
    2     <span id="video-info" hidden data-video-url="{{ course.video_url }}"
    3           data-cover-url="{{ course.cover_url }}"></span>
    4     <!-- 用来存储播放器 -->
    5     <div id="playercontainer"></div>
    6 </div>

     

  4. 通过 js 初始化播放器,并传递视频地址;
     1 function CourseDetail() {
     2 
     3 }
     4 
     5 // 视频播放;
     6 CourseDetail.prototype.initPlayer = function () {
     7     var videoInfoSpan = $('#video-info');
     8     var video_url = videoInfoSpan.attr('data-video-url');
     9     var cover_url = videoInfoSpan.attr('data-cover-url');
    10     var player = cyberplayer("playercontainer").setup({
    11         width: '100%',
    12         height: '100%',
    13         file: video_url,            // 视频链接;
    14         image: cover_url,           // 封面图链接;
    15         autostart: false,           // 是否自动播放;
    16         stretching: 'uniform',      // 扩大;
    17         repeat: false,              // 是否重复;
    18         volume: 100,                // 音量;
    19         controls: true,             // 底部控制栏;
    20         primary: "flash",           // 使用flash;
    21         tokenEncrypt: true,         // 采用token加密;
    22         ak: '86dc62e1dbd4455080ab1cfc5e587b17', // AccessKey;
    23     });
    24     
    25     // 视频播放前的事件;
    26     player.on('beforePlay', function (e) {
    27         if (!/m3u8/.test(e.file)) {
    28             return;
    29         }
    30         xfzajax.get({
    31             'url': '/course/course_token/',
    32             'data': {
    33                 'video': video_url
    34             },
    35             'success': function (result) {
    36                 if (result['code'] === 200) {
    37                     var token = result['data']['token'];
    38                     // 将‘tokon’设置入‘player’中,使播放器获取视频密码;
    39                     player.setToken(e.file, token);
    40                 } else {
    41                     alert('token错误!')
    42                 }
    43             },
    44             'fail': function (error) {
    45                 console.log(error)
    46             }
    47         })
    48     })
    49 };
    50 
    51 CourseDetail.prototype.run = function () {
    52     this.initPlayer();
    53 };
    54 
    55 $(function () {
    56     var course = new CourseDetail();
    57     course.run()
    58 });
    View Code

     

 

三、购买视频及播放;

 

1、使用 PaysApi 

  1. 文档的使用及说明:https://www.paysapi.com/docindex;
  2. 发起付款接口的说明文档:https://www.paysapi.com/docpay;

 

2、代

  1. Models及HTML模板
     1 # 支付页面模板;
     2 class CourseOrder(models.Model):
     3     uid = ShortUUIDField(primary_key=True)
     4     course = models.ForeignKey("Course",on_delete=models.DO_NOTHING)
     5     buyer = models.ForeignKey("xfzauth.User",on_delete=models.DO_NOTHING)
     6     amount = models.FloatField(default=0)
     7     pub_time = models.DateTimeField(auto_now_add=True)
     8     # 支付渠道:1:代表支付宝支付;2:代表微信支付;
     9     istype = models.SmallIntegerField(default=1)
    10     # 支付状态:1:代表未支付;2:代表支付成功;
    11     status = models.SmallIntegerField(default=1)
    View Code
     1 <!-- 部分相关HTML模板 -->
     2 <form action="https://pay.bbbapi.com/" method="post" id="pay-form">
     3     <input type="hidden" name="uid" value="49dc532695baa99e16e01bc0">
     4     <input type="hidden" name="price" value="{{ course.price }}">
     5     <input type="hidden" name="notify_url" value="{{ notify_url }}">
     6     <input type="hidden" name="return_url" value="{{ return_url }}">
     7     <input type="hidden" name="orderid" value="{{ order.pk }}">
     8     <input type="hidden" name="orderuid" value="{{ request.user.pk }}">
     9     <input type="hidden" name="goodsname" value="{{ course.title }}">
    10     <input type="hidden" name="key" value="">
    11     <!-- 微信与支付宝支付 -->
    12     <div class="pay-way">
    13         <label for="istype-wx" class="label">
    14             <input id="istype-wx" type="radio" name="istype" value="2">
    15             <span class="wx-btn fk-btn">
    16             <img src="http://nos.netease.com/test-edu-image/1BD9F69D6760CE1508D2269864AA54F8.png" alt="">
    17         </span>
    18         </label>
    19         <label for="istype-zfb" class="label">
    20             <input id="istype-zfb" type="radio" name="istype" value="1" checked>
    21             <span class="zfb-btn fk-btn"></span>
    22         </label>
    23         <div style="clear: both;"></div>
    24     </div>
    25     <div class="submit-group">
    26         <input type="submit" value="去支付" id="submit-btn" class="submit-btn">
    27     </div>
    28 </form>
    View Code

     

  2. 获取“key”值
     1 from utils import restful
     2 from apps.xfzauth.decorators import xfz_login_required
     3 from hashlib import md5
     4 
     5 # 获取“key”;用户登录的情况下;
     6 @xfz_login_required
     7 def course_order_key(request):
     8     goodsname = request.POST.get("goodsname")       # 商品名称;
     9     istype = request.POST.get("istype")             # 支付渠道;
    10     notify_url = request.POST.get("notify_url")     # 通知回调网址;
    11     orderid = request.POST.get("orderid")           # 商户自定义订单号;
    12     orderuid = str(request.user.pk)                 # 商户自定义客户号;
    13     price = request.POST.get("price")               # 价格;
    14     return_url = request.POST.get("return_url")     # 跳转网址;
    15 
    16     # 在官网个人账户设置中的“API接口信息”中获取“token”与“uid”的值:
    17     token = 'e6110f92abcb11040ba153967847b7a6'
    18     uid = '49dc532695baa99e16e01bc0'
    19 
    20     # 秘钥“key”的拼接顺序:goodsname + istype + notify_url + orderid + orderuid + price + return_url + token + uid
    21     key = md5((goodsname + istype + notify_url + orderid + orderuid + price + return_url + token + uid).encode(
    22         "utf-8")).hexdigest()
    23     return restful.result(data={"key": key})
    View Code

     

  3. 购买课程
     1 # 购买课程;
     2 @xfz_login_required
     3 def course_order(request, course_id):
     4     course = Course.objects.get(pk=course_id)
     5     order = CourseOrder.objects.create(course=course, buyer=request.user, status=1, amount=course.price)
     6     context = {
     7         'course': course,
     8         'order': order,
     9         # 跳转链接:/course/notify_url/;
    10         'notify_url': request.build_absolute_uri(reverse('course:notify_view')),
    11         'return_url': request.build_absolute_uri(reverse('course:course_detail', kwargs={"course_id": course.pk}))
    12     }
    13     return render(request, 'course/course_order.html', context=context)
    14 
    15 # 使用订单ID更新支付状态;(关闭CSRF保护)
    16 @csrf_exempt
    17 def notify_view(request):
    18     orderid = request.POST.get('orderid')
    19     CourseOrder.objects.filter(pk=orderid).update(status=2)
    20     return restful.ok()
    View Code

     

  4. 前端“js”文件
     1 function CourseOrder() {
     2 
     3 }
     4 
     5 CourseOrder.prototype.run = function () {
     6     this.OrderEvent();
     7 };
     8 
     9 // 订购事件;(发起付款接口时需处理的数据)
    10 CourseOrder.prototype.OrderEvent = (function () {
    11     var submitBtn = $("#submit-btn");
    12     submitBtn.click(function (event) {
    13         event.preventDefault();
    14         var goodsname = $("input[name='goodsname']").val();
    15         var istype = $("input[name='istype']:checked").val();
    16         var notify_url = $("input[name='notify_url']").val();
    17         var orderid = $("input[name='orderid']").val();
    18         var price = $("input[name='price']").val();
    19         var return_url = $("input[name='return_url']").val();
    20         xfzajax.post({
    21             'url': '/course/course_order_key/',
    22             'data': {
    23                 'goodsname': goodsname,
    24                 'istype': istype,
    25                 'notify_url': notify_url,
    26                 'orderid': orderid,
    27                 'price': price,
    28                 'return_url': return_url
    29             },
    30             'success': function (result) {
    31                 if(result['code'] === 200){
    32                     var key = result['data']['key'];
    33                     var keyInput = $("input[name='key']");
    34                     keyInput.val(key);
    35                     $("#pay-form").submit();
    36                 }
    37             }
    38         });
    39     });
    40 });
    41 
    42 $(function () {
    43     var order = new CourseOrder();
    44     order.run();
    45 });
    View Code

     

转载于:https://www.cnblogs.com/liqiongming/p/11016434.html


http://chatgpt.dhexx.cn/article/t76m0UEY.shtml

相关文章

基于SSM bootstrap的JSP MYSQL路路通汽车租赁系统

车辆租赁系统&#xff0c;主要包括对用户的管理&#xff0c;司机的管理&#xff0c;车辆的管理及租赁的管理等四大模块。车辆租用赁系统管理员系统的功能模块设计如图4-1&#xff0c;操作员子系统功能模块图如图4-2所示&#xff1a; 图4-1车辆租赁管理系统管理员操作子系统功能…

PaysApi第三方支付接口的接入与使用 React前端SSM后端

本文实现涉及实现思路以及预期结果 前端React 后端SSM 支付接口PaysApi以及阿里云 正式开始 对比了很多第三方支付接口&#xff0c;选到paysapi也是因为它捕获信息的能力经过测试后还不错&#xff0c;官方接口文档说明的非常清楚 &#xff0c;所以选用&#xff0c;这个demo…

企业微信接入自研小程序流程

一、背景 企业微信是企业内部办公常用的即时通讯工具&#xff0c;可以作为企业内部工作的枢纽&#xff0c;例如&#xff1a;重要内容通知&#xff0c;重要应用的集成等。 二、自研程序接入企业微信配置 1.登录企业微信管理后台https://work.weixin.qq.com/ 2.找到应用管理-…

【微信小程序】小程序发送订阅消息教程

1.订阅消息 订阅消息前身也就是模板消息,使用过模板消息的同学在使用订阅消息的时候就会非常简单了。下面让我们来看一下订阅消息如何使用! 传送门:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html 2.获取模板ID 这个在…

微信小程序的发布流程

当我们开发完小程序后需要做哪些事情才能上线&#xff0c;在小程序搜索到并且可以正常使用呢 首先&#xff0c;需要把http改成https&#xff0c;因为在本地调试的时侯我们在工具不检验合法域名&#xff0c;但是线上的版本必须是https&#xff0c;所以需要后端去申请一下。 然…

发布微信小程序体验版的流程

文章目录 发布微信小程序体验版的流程第一步第二步第三步在微信开发者工具的右上角&#xff0c;点击选择 **上传** ![在这里插入图片描述](https://img-blog.csdnimg.cn/66879544b7ec4cb6ae9c18e84352b79f.png) 第四步第五步总结 发布微信小程序体验版的流程 提示&#xff1a;…

微信小程序发布详细步骤

第一步&#xff1a;检查代码质量 运行微信开发者工具 > 点击详情&#xff0c;选择性能分析&#xff0c;进行代码质量的扫描。 把未通过的部分改改。 第二步&#xff1a;发布体验版 点击上传 > 填写版本号&#xff0c;项目备注 > 点击右下角上传即可 第三步&#xff…

微信小程序发送消息推送

在小程序开发中&#xff0c;如果想实现:用户发给小程序的消息以及开发者需要的事件推送,在小程序项目中&#xff0c;我们想要实现这样一个功能&#xff0c; 比如我们小程序中的客服功能&#xff0c;我不想要使用小程序后台的在线客服功能&#xff0c;但我又想实现客服功能&…

微信小程序订阅消息通过服务通知发送

第一步&#xff1a;申请模板获取模板ID&#xff1a; 登录微信公众平台 -> 功能 -> 订阅消息 -> 对里面的模板进行选用或者自定义 公共模板库里面的模板分为一次性订阅 和永久订阅&#xff0c;这个是根据你创建小程序时选择的行业进行区分的。 https://developers.we…

给微信小程序发送消息

给微信小程序发送消息 所用技术&#xff1a;后台&#xff1a;jeecgboot 数据库&#xff1a;oracle 前台&#xff1a;vue2.0 首先登陆微信公众平台 链接: https://mp.weixin.qq.com/ 1.登陆之后每个公司 都会有自己得相关参数例如 appid之类得 后面代码里时要用到的 2.然后先…

微信小程序通过公众号服务号发送消息

一、基础概念: 准备条件&#xff1a; 1、公众号和小程序必须在同一个公司主体下。 2、在公众号后台需要对小程序进程绑定操作。 公众号提供了两种消息&#xff0c;一种是订阅消息&#xff0c;一种是模板消息。 订阅消息需要用户主动订阅&#xff0c;然后才能接收消息&#x…

六、微信小程序发布流程

目录 1、上传2、提交审核 1、上传 当我们写完代码后 点击微信开发者工具的上传 要么是体验版 要么是1.0.1最新版 直接点击确定或上传即可 【前提是你本人必须是小程序的管理员或项目成员】 上传成功会有提示弹窗 2、提交审核 在版本管理中我们能看到上传的小程序版本 在这里我…

微信小程序发布全流程

1.在微信公众平台注册 我选的是用QQ邮箱注册的&#xff0c;因为我的163邮箱和微信绑定的&#xff0c;不能使用注册。 登陆进来就是这个页面啦。 2.npm打包&#xff08;假设您的电脑已经安装了nodeJS&#xff09; 选中您的项目&#xff0c;然后到项目的根目录下 执行npm ins…

微信小程序申请+开发+发布流程

框架用的Taro&#xff0c;开发工具用的是VSCode微信开发者工具&#xff0c;VSCode主要用来编码&#xff0c;微信开发者工具主要用来看和最后上传那么一下&#xff0c;其他没什么好说的。放张图&#xff0c;大家自行体会&#xff1a; 利用taro发布web程序如下&#xff1a; 过程整…

微信小程序发布流程

1.授权 登录微信公众平台微信公众平台&#xff0c;给相应人员授权&#xff1b;最好同时添加体验成员&#xff08;用于验证测试&#xff09;。 2.开发工具及代码 下载官方的微信开发者工具&#xff0c;使用微信扫一扫登录&#xff1b;同时下载最新的项目代码&#xff0c;导入…

信号与系统(四)

注&#xff1a;本博客是基于奥本海姆的《信号与系统》第二版编写&#xff0c;主要是为了自己考研&#xff0c;准备专业课。 (转载&#xff1a;https://blog.csdn.net/Explorer_day/article/details/77177542) 一、基本系统性质 1、记忆系统与无记忆系统 ①无记忆系统 如果对…

信号与系统 | 信号与系统概述 | 信号的基本概念和分类

文章目录 常见的概念信号的描述信号的分类确定信号和随机信号连续信号和离散信号周期信号和非周期信号能量信号和功率信号一维信号和多维信号因果信号和非因果信号 信号的matlab表示与绘图 常见的概念 消息&#xff0c;来自外界的各种报道统称为消息信息&#xff0c;消息中有意…

城市轨道交通信号系统学习笔记(四)信号机

信号机 <font face"楷体" size5>一、地面信号机的设置</font><font face"楷体" size5>二、信号显示</font> 城市轨道交通采用与铁路相同的色灯信号机&#xff0c;但设置位置和信号显示不同于铁路&#xff0c;信号显示距离也有自己…

信号与系统(一)

注&#xff1a;本博客是基于奥本海姆的《信号与系统》第二版编写&#xff0c;主要是为了自己考研&#xff0c;准备专业课。 (转载&#xff1a;https://blog.csdn.net/Explorer_day/article/details/76910002) 一、连续时间和离散时间信号 1、信号的定义 ①在物理上&#xf…

操作系统:信号

文章目录 一 信号概念1. 信号简介2. 信号/事件 产生方式3. 信号处理方式 二 信号实现1. 不可靠信号2. 可靠与不可靠信号类型3. 被中断的系统调用4. 信号函数4.1 信号发送函数 kill/raise4.2 定时发送信号函数 alarm4.3 信号捕获等待函数 pause 5. 信号集5.1 信号集来由5.2 信号…