视频的上传及购买播放

一、上传视频

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 });

三、购买视频及播放;

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)

     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>

  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})

  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()

  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 });

原文地址:https://www.cnblogs.com/liqiongming/p/11016434.html

时间: 2024-10-25 18:14:15

视频的上传及购买播放的相关文章

PHP如何有效实现多视频同时上传功能

视频的出现让网站更加有生有色,对于php上传视频而言,我需要实现多视频上传,视频播放功能,静音功能,全屏播放,下载视频功能等一体的需求,接下来就为大家详细讲解一下如何实现多视频同时上传这样一个功能.具体代码如下: <form method="POST" name="myform" action="{:U('doeditvideo')}" enctype="multipart/form-data"> *视频: *上传

小程序短视频项目———上传短视频业务

一.用户选择视频 1.微信选中视频接口 wx.chooseVideo(Object object) 拍摄视频或从手机相册中选视频. 参数 Object object 属性 类型 默认值 是否必填 说明 支持版本 sourceType Array.<string> ['album', 'camera'] 否 视频选择的来源   compressed boolean true 否 是否压缩所选择的视频文件 >= 1.6.0 maxDuration number 60 否 拍摄视频最长拍摄时间

陈松松:视频难上传,视频营销到底怎么破?

本文作者:陈松松 每个视频,都是你的金牌业务员 这是我的第4篇视频营销原创文章 真如我所料,坚持不是一个简单的事! 我一直以为做原创视频与写原创文章一样简单,下笔才知道,写文章也要训练! 最近我收到最多的问题就是松松老师,视频营销还能做不,我现在上传100多个视频能通过十几个,好的时候二三十个,你有什么高招没? 现在弄的我一点信心都没有了! 我大概问了下,他们做视频营销很简单:通过各个视频平台找到他们要的视频,然后下载下来,加个广告语,改下视频格式,剪掉视频时间长度,换个标题,切换个大小号,一天

在ASP.NET中实现图片、视频文件上传方式

一.图片 1.在前端用<asp:FileUpload ID="UpImgName" runat="server"/>控件 2.在后台.cs中写上 protected void btnSubmit_Click(object sender,EventArgs e) { string strImgPath=string.Empty; string strDateTime=dateTime.Now.Tostring("yyyyMMddhhmmss&qu

PHP实现视频文件上传完整实例

PHP实现视频文件上传完整实例 转载 这篇文章主要介绍了PHP实现视频文件上传的技巧,包含了PHP配置信息的设计及大文件的处理,需要的朋友可以参考下 本文以一个完整实例的形式实现了视频文件上传的功能.虽然是比较基础的应用,仍有一定的参考价值.分享给大家供大家参考之用.具体方法如下: 首先,对PHP来说视频也属于文件,我们利用这个道理,可以通过与上传普通文件类似的方式实现上传PHP视频文件.不同的是视频文件一般较大,上传时间长,而php配置文件也对上传文件的大小有限制.如果需要更好地用PHP实现文

制作Appstore预览视频并上传

首先保证你的设备是mac,系统版本为10.10或以上. 工具: 浏览器:safari. 录像:QuickTime player 视频编辑:HandBrake 1.录制视频:打开QuickTime,选择[文件]-[新建影片录制]点击下拉框出现下面界面. 开始录制,注意视频应该在15-30秒之内. 2.编辑 这里主要是转换视频的编码格式.我们用到的工具是HandBrake,进入HandBrake界面导入我们刚才录制的视频.这里我们主要配置下面几个选项 ①FPS:我们用24就好了.②Audio的采样率

Tp3如何实现本地视频文件上传到七牛云

对于七牛云的使用,估计有些刚接触开发的技术人员还不太清楚,那么更不要说如何实现本地视频上传到七牛云转储了,其实这个技术并没有想象中的那么困难,下面就来跟大家详细介绍一下流程: 1.首先我们要先去寻找七牛云的SDK网址,打开后直接下载就行了; 2.下载完成之后我们把它放在tp框架的./ThinkPHP/Extend/Vendor/目录下; 3.完成之后,前期的准备工作就完成了,接下来就是自己上手写代码了: 首先肯定是先在模板部分建立一个form表单: *视频上传: 我们就提交到News控制器里的d

JavaWeb-SpringBoot_(上)腾讯点播服务之视频的上传

使用Gradle编译项目 传送门 腾讯视频云点播 传送门 腾讯点播服务之视频的显示(下) [完成时会将源码上传github] 传送门 github 传送门 (一).使用原生JQuery获取文件 (二).简单上传文件(无封面提示信息)  (三).上传视频及封面并增加上传提示信息 各个功能模块的默认配置文件application.properties #thymeleaf编码风格 spring.thymeleaf.encoding=UTF-8 #热部署静态文件 spring.thymeleaf.ca

今日头条号短视频自媒体研究---新手上路,正确拍短视频并上传(原创)

1.需要先开通一个头条号,注意是头条号,这个是创作者的号,而不是今日头条号, 有的网友通过今日头条号上传了视频,发现没有播放量,也没有收益,原因就在这里,上传错了. 头条号登陆地址: https://mp.toutiao.com/login 2.手机剪辑软件: 快影,videoleap 电脑端剪辑软件: Pr 3.设备 开始的时候用自己的手机就行,但记住一定要横屏拍摄,在上传到后台里面的西瓜视频里面 原文地址:https://www.cnblogs.com/kenshinobiy/p/11023