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

  使用Gradle编译项目  传送门

  腾讯视频云点播  传送门

  腾讯点播服务之视频的显示(下)  【完成时会将源码上传github】  传送门

  github    传送门

  

 

  (一)、使用原生JQuery获取文件

  (二)、简单上传文件(无封面提示信息) 

  (三)、上传视频及封面并增加上传提示信息

  各个功能模块的默认配置文件application.properties

#thymeleaf编码风格
spring.thymeleaf.encoding=UTF-8

#热部署静态文件
spring.thymeleaf.cache=false

#使用HTML5的标签
spring.thymeleaf.model=HTML5

#使用H2控制台
spring.h2.console.enabled=true

前申:使用原生JQuery获取文件

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
<meta charset="UTF-8">
<title>Gary_Video</title>
</head>
<body>

    <h1>Gary上传视频</h1>

    <from id="from1">
        <input id="uploadVideoNow-file" type="file" onchange="changeInput(this)" style="display:none;">

    </from>

    <!-- a标签,当点击之后,执行change函数中的内容 -->
    <a id="uploadVideoNow" href="javascript:void(0);" onclick="change()">点击上传视频</a>

    <script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
    <script type="text/javascript">
        function change(){
            $("#uploadVideoNow-file").click();
        }

        function changeInput(e){
            alert(e.files[0].name);
        }

    </script>

</body>
</html>

video.html

package com.Gary.videodemo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

@RestController
public class IndexController {

    @RequestMapping("/")
    public ModelAndView index()
    {
        return new ModelAndView("/video.html");
    }
}

IndexController.java

    <from id="from1">
        <input id="uploadVideoNow-file" type="file" onchange="changeInput(this)" style="display:none;">

    </from>

    <!-- a标签,当点击之后,执行change函数中的内容 -->
    <a id="uploadVideoNow" href="javascript:void(0);" onclick="change()">点击上传视频</a>

    <script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
    <script type="text/javascript">
        function change(){
            $("#uploadVideoNow-file").click();
        }

        function changeInput(e){
            alert(e.files[0].name);
        }

    </script>

一、实现简单上传视频    官方文档:传送门

  返回"success"上传成功!!!

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
<meta charset="UTF-8">
<title>Gary_Video</title>
</head>
<body>

    <h1>Gary上传视频</h1>

    <from id="from1">
        <input id="uploadVideoNow-file" type="file" onchange="changeInput(this)" style="display:none;">

    </from>

    <!-- a标签,当点击之后,执行change函数中的内容 -->
    <a id="uploadVideoNow" href="javascript:void(0);" onclick="change()">点击上传视频</a>

    <!-- 在web中引入sdk,js -->
    <script src="//imgcache.qq.com/open/qcloud/js/vod/sdk/ugcUploader.js"></script>
    <script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" th:inline="javascript">

        var getSignature = function(callback)
        {
            $.ajax({
                url:[[@{~/sign}]],
                type:"POST",
                success:function(result)
                {
                    alert(result);
                    //即可上传视频
                    callback(result);
                }

            })
        }

        function change()
        {
            $("#uploadVideoNow-file").click();
        }

        function changeInput(e){
             //alert(e.files[0].name);
            var videoFile = e.files[0];
            qcVideo.ugcUploader.start({
                //视频文件
                videoFile:videoFile,
                //上传位置
                getSignature:getSignature,
                //是否上传声音
                allowAudio:1,
                //上传成功
                success:function(result)
                {
                    alert("success");
                },
                //上传失败
                error:function(result)
                {
                    alert("error");
                },
                //上传过程中
                progress:function(result)
                {

                },
                //上传完成
                finish:function(result)
                {
                    alert("finish");
                }
            })
        }

    </script>

</body>
</html>

video.html

package com.Gary.videodemo.controller;

import java.util.Random;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.Gary.videodemo.utils.Signature;

@RestController
public class IndexController {

    @RequestMapping("/")
    public ModelAndView index(){
        return new ModelAndView("/video.html");
    }

    @RequestMapping("/sign")
    @ResponseBody
    public String getSign()
    {
        //得到Sign
            Signature sign = new Signature();
            //个人API密钥中的Secret Id
            sign.setSecretId("AKIDkNsDQWZOYYVSHu49kDh9Uh1FSo3Bxxxx");
            //个人API密钥中的Secret Key
            sign.setSecretKey("XDn1a3NWzN0Tp4vH3zpSp5fEX2Rqxxxx");
            sign.setCurrentTime(System.currentTimeMillis() / 1000);
            sign.setRandom(new Random().nextInt(java.lang.Integer.MAX_VALUE));
            sign.setSignValidDuration(3600 * 24 * 2);

            String signature = null;
            try {
                signature = sign.getUploadSignature();
                System.out.println("signature : " + signature);
            } catch (Exception e) {
                System.out.print("获取签名失败");
                e.printStackTrace();
            }

            return signature;
    }

}

IndexController.java

package com.Gary.videodemo.utils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;

public class Signature {
    private String secretId;
    private String secretKey;
    private long currentTime;
    private int random;
    private int signValidDuration;

    private static final String HMAC_ALGORITHM = "HmacSHA1";
    private static final String CONTENT_CHARSET = "UTF-8";

    public static byte[] byteMerger(byte[] byte1, byte[] byte2) {
        byte[] byte3 = new byte[byte1.length + byte2.length];
        System.arraycopy(byte1, 0, byte3, 0, byte1.length);
        System.arraycopy(byte2, 0, byte3, byte1.length, byte2.length);
        return byte3;
    }

    public String getUploadSignature() throws Exception {
        String strSign = "";
        String contextStr = "";

        long endTime = (currentTime + signValidDuration);
        contextStr += "secretId=" + java.net.URLEncoder.encode(secretId, "utf8");
        contextStr += "&currentTimeStamp=" + currentTime;
        contextStr += "&expireTime=" + endTime;
        contextStr += "&random=" + random;

        try {
            Mac mac = Mac.getInstance(HMAC_ALGORITHM);
            SecretKeySpec secretKey = new SecretKeySpec(this.secretKey.getBytes(CONTENT_CHARSET), mac.getAlgorithm());
            mac.init(secretKey);

            byte[] hash = mac.doFinal(contextStr.getBytes(CONTENT_CHARSET));
            byte[] sigBuf = byteMerger(hash, contextStr.getBytes("utf8"));
            strSign = new String(new BASE64Encoder().encode(sigBuf).getBytes());
            strSign = strSign.replace(" ", "").replace("\n", "").replace("\r", "");
        } catch (Exception e) {
            throw e;
        }
        return strSign;
    }

    public void setSecretId(String secretId) {
        this.secretId = secretId;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    public void setCurrentTime(long currentTime) {
        this.currentTime = currentTime;
    }

    public void setRandom(int random) {
        this.random = random;
    }

    public void setSignValidDuration(int signValidDuration) {
        this.signValidDuration = signValidDuration;
    }
}

Signature.java

  目录结构

  

  

  Signature.java得到加密后的字符串

  通过IndexController.java中的getSign()方法得到加密后的字符串并通过函数指针回传给getSignature:getSignature

@RequestMapping("/sign")
    @ResponseBody
    public String getSign()
    {
        //得到Sign
            Signature sign = new Signature();
            //个人API密钥中的Secret Id
            sign.setSecretId("AKIDkNsDQWZOYYVSHu49kDh9Uh1FSoxxxxxx");
            //个人API密钥中的Secret Key
            sign.setSecretKey("XDn1a3NWzN0Tp4vH3zpSp5fEX2xxxxxx");
            sign.setCurrentTime(System.currentTimeMillis() / 1000);
            sign.setRandom(new Random().nextInt(java.lang.Integer.MAX_VALUE));
            sign.setSignValidDuration(3600 * 24 * 2);

            String signature = null;
            try {
                signature = sign.getUploadSignature();
                System.out.println("signature : " + signature);
            } catch (Exception e) {
                System.out.print("获取签名失败");
                e.printStackTrace();
            }

            return signature;
    }
var getSignature = function(callback)
        {
            $.ajax({
                url:[[@{~/sign}]],
                type:"POST",
                success:function(result)
                {
                    alert(result);
                    //即可上传视频
                    callback(result);
                }

            })
        }

  得到加密后的字符串后就可以上传到我们个人的腾讯云控制台中

    <from id="from1">
        <input id="uploadVideoNow-file" type="file" onchange="changeInput(this)" style="display:none;">

    </from>

    <!-- a标签,当点击之后,执行change函数中的内容 -->
    <a id="uploadVideoNow" href="javascript:void(0);" onclick="change()">点击上传视频</a>

    <!-- 在web中引入sdk,js -->
    <script src="//imgcache.qq.com/open/qcloud/js/vod/sdk/ugcUploader.js"></script>
    <script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" th:inline="javascript">
    function change()
        {
            $("#uploadVideoNow-file").click();
        }

        function changeInput(e){
             //alert(e.files[0].name);
            var videoFile = e.files[0];
            qcVideo.ugcUploader.start({
                //视频文件
                videoFile:videoFile,
                //上传位置
                getSignature:getSignature,
                //是否上传声音
                allowAudio:1,
                //上传成功
                success:function(result)
                {
                    alert("success");
                },
                //上传失败
                error:function(result)
                {
                    alert("error");
                },
                //上传过程中
                progress:function(result)
                {

                },
                //上传完成
                finish:function(result)
                {
                    alert("finish");
                }
            })
        }

    </script>

  为了更好的显示上传信息,可添加id标签,通过实现qcVideo.ugcUploader.start()中progress:function(result)方法得到上传进度信息

 

  因为上传过程中会一直调用progress:function(result)()

  所以可以添加一个id标签用来显示上传提示信息

    <!-- 结果 -->
    <div id="resultBox">Gary</div>

  

  修改qcVideo.ugcUploader.start()函数

qcVideo.ugcUploader.start({
                //视频文件
                videoFile:videoFile,
                //上传位置
                getSignature:getSignature,
                //是否上传声音
                allowAudio:1,
                //上传成功
                success:function(result)
                {
//                     alert("success");
                    $(‘[name=videoresult]‘).text(‘上传成功‘);
                },
                //上传失败
                error:function(result)
                {
//                     alert("error");
                    $(‘[name=videoresult]‘).text(‘上传失败‘);
                },
                //正在上传过程中会一直调用的Update
                progress:function(result)
                {
                    $(‘[name=videoname]‘).text(result.name);
                    $(‘[name=videosha]‘).text(Math.floor(result.shacurr*100)+"%");
                    $(‘[name=videocurr]‘).text(Math.floor(result.curr*100)+"%");
                },
                //上传完成
                finish:function(result)
                {
//                     alert("finish");
                    $(‘[name=videourl]‘).text(result.videoUrl);
                }
            })
        }

        //在id里边加东西
        function addUploaderMsgBox()
        {
            var html = ‘<div name = 1>‘
            html+=‘视频的名称:<span name="videoname"></span>;‘+
            ‘计算sha进度:<span name="videosha"></span>;‘+
            ‘上传进度:<span name="videocurr"></span>;‘+
            ‘上传结果:<span name="videoresult"></span>;‘+
            ‘地址:<span name="videourl"></span>;‘;

            html+="</div>"

            $("#resultBox").append(html);

        }

 二、上传视频及封面并增加上传提示信息

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
<meta charset="UTF-8">
<title>Gary_Video</title>
</head>
<body>

    <h1>Gary上传视频</h1>

    <from id="from1">
        <input id="uploadVideoNow-file" type="file" onchange="changeInput(this)" style="display:none;">

    </from>

    <!-- a标签,当点击之后,执行change函数中的内容 -->
    <a id="uploadVideoNow" href="javascript:void(0);" onclick="change()">点击上传视频</a>

    <br>
    <hr>
    <!-- 结果 -->
    <div id="resultBox">Gary</div>

    <!-- 在web中引入sdk,js -->
    <script src="//imgcache.qq.com/open/qcloud/js/vod/sdk/ugcUploader.js"></script>
    <script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" th:inline="javascript">

        var getSignature = function(callback)
        {
            $.ajax({
                url:[[@{~/sign}]],
                type:"POST",
                success:function(result)
                {
                    alert(result);
                    //即可上传视频
                    callback(result);
                }

            })
        }

        function change()
        {
            $("#uploadVideoNow-file").click();
        }

        function changeInput(e){
             //alert(e.files[0].name);
            var videoFile = e.files[0];
            //添加视频进度的显示
            addUploaderMsgBox();
            qcVideo.ugcUploader.start({
                //视频文件
                videoFile:videoFile,
                //上传位置
                getSignature:getSignature,
                //是否上传声音
                allowAudio:1,
                //上传成功
                success:function(result)
                {
//                     alert("success");
                    $(‘[name=videoresult]‘).text(‘上传成功‘);
                },
                //上传失败
                error:function(result)
                {
//                     alert("error");
                    $(‘[name=videoresult]‘).text(‘上传失败‘);
                },
                //正在上传过程中会一直调用的Update
                progress:function(result)
                {
                    $(‘[name=videoname]‘).text(result.name);
                    $(‘[name=videosha]‘).text(Math.floor(result.shacurr*100)+"%");
                    $(‘[name=videocurr]‘).text(Math.floor(result.curr*100)+"%");
                },
                //上传完成
                finish:function(result)
                {
//                     alert("finish");
                    $(‘[name=videourl]‘).text(result.videoUrl);
                }
            })
        }

        //在id里边加东西
        function addUploaderMsgBox()
        {
            var html = ‘<div name = 1>‘
            html+=‘视频的名称:<span name="videoname"></span>;‘+
            ‘计算sha进度:<span name="videosha"></span>;‘+
            ‘上传进度:<span name="videocurr"></span>;‘+
            ‘上传结果:<span name="videoresult"></span>;‘+
            ‘地址:<span name="videourl"></span>;‘;

            html+="</div>"

            $("#resultBox").append(html);

        }

    </script>

</body>
</html>

video.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
<meta charset="UTF-8">
<title>Gary_Video</title>
</head>
<body>

    <form>
        <!-- 添加视频 -->
        <input id="addVideo-file" onchange="addVideo(this)" type="file" style="display: none;">
        <!-- 添加封面 -->
        <input id="addCover-file" onchange="addCover(this)" type="file" style="display:none;">
    </form>

    <h1>上传视频+封面</h1>
    <!-- 添加视频 -->
    <a id="addVideo" onclick="videoClick()" href="javascript:void(0)">上传视频</a>
    <!-- 添加封面 -->
    <a id="addCover" onclick="coverClick()" href="javascript:void(0)">上传封面</a>
    <!-- 上传按钮 -->
    <a id="upload" onclick="upload()" href="javascript:void(0)">确定上传</a>

    <br>
    <hr>
    <!-- 结果 -->
    <div id="resultBox">Gary</div>

    <script src="//imgcache.qq.com/open/qcloud/js/vod/sdk/ugcUploader.js"></script>
    <script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" th:inline="javascript">

        var videoFile = null;
        var coverFile = null;

        //得到加密后的字符串
        var getSignature = function(callback)
        {
            $.ajax({
                url:[[@{~/sign}]],
                type:"POST",
                success:function(result)
                {
                    callback(result);
                }
            })
        }

        //input change事件
        function addVideo(e)
        {
            //alert(e.files[0].name);
            videoFile = e.files[0];
        }
        //input change事件
        function addCover(e)
        {
            //alert(e.files[0].name);
            coverFile = e.files[0];
        }

        //a标签点击事件
        function videoClick()
        {
            $("#addVideo-file").click();
        }

        function coverClick()
        {
            $("#addCover-file").click();
        }

        //上传按钮
        function upload()
        {
            //提示信息
            addUploaderMsgBox();
            startUploader();
        }

        var startUploader = function()
        {
            //上传视频的核心
            qcVideo.ugcUploader.start({
                //视频
                videoFile:videoFile,
                //封面
                coverFile:coverFile,

                getSignature:getSignature,
                allowAudio:1,

                success:function(result)
                {
                    //alert("success")
                    $(‘[name=videoresult]‘).text(‘上传成功‘)
                },
                error:function(result)
                {
                    $(‘[name=videoresult]‘).text(‘上传失败‘)
                },
                progress:function(result)
                {
                    $(‘[name=videoname]‘).text(result.name)
                    $(‘[name=videosha]‘).text(Math.floor(result.shacurr*100)+"%")
                    $(‘[name=videocurr]‘).text(Math.floor(result.curr*100)+"%")
                },
                finish:function(result)
                {
                    $(‘[name=videourl]‘).text(result.videoUrl)
                }

            })
        }

        function addUploaderMsgBox()
        {
            var html = ‘<div name = 1>‘
            html+=‘视频的名称:<span name="videoname"></span>;‘+
            ‘计算sha进度:<span name="videosha"></span>;‘+
            ‘上传进度:<span name="videocurr"></span>;‘+
            ‘上传结果:<span name="videoresult"></span>;‘+
            ‘地址:<span name="videourl"></span>;‘;

            html+="</div>"

            $("#resultBox").append(html);

        }
    </script>

</body>
</html>

video.html

package com.Gary.videodemo.controller;

import java.util.Random;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.Gary.videodemo.utils.Signature;

@RestController
public class IndexController {

    @RequestMapping("/plus")
    public ModelAndView plus()
    {
        return new ModelAndView("/video-plus.html");
    }

    @RequestMapping("/")
    public ModelAndView index(){
        return new ModelAndView("/video.html");
    }

    @RequestMapping("/sign")
    @ResponseBody
    public String getSign()
    {
        //得到Sign
            Signature sign = new Signature();
            //个人API密钥中的Secret Id
            sign.setSecretId("AKIDkNsDQWZOYYVSHu49kDh9Uh1FSoxxxxxx");
            //个人API密钥中的Secret Key
            sign.setSecretKey("XDn1a3NWzN0Tp4vH3zpSp5fEX2xxxxxx");
            sign.setCurrentTime(System.currentTimeMillis() / 1000);
            sign.setRandom(new Random().nextInt(java.lang.Integer.MAX_VALUE));
            sign.setSignValidDuration(3600 * 24 * 2);

            String signature = null;
            try {
                signature = sign.getUploadSignature();
                System.out.println("signature : " + signature);
            } catch (Exception e) {
                System.out.print("获取签名失败");
                e.printStackTrace();
            }

            return signature;
    }

}

IndexController.java

package com.Gary.videodemo.utils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;

public class Signature {
    private String secretId;
    private String secretKey;
    private long currentTime;
    private int random;
    private int signValidDuration;

    private static final String HMAC_ALGORITHM = "HmacSHA1";
    private static final String CONTENT_CHARSET = "UTF-8";

    public static byte[] byteMerger(byte[] byte1, byte[] byte2) {
        byte[] byte3 = new byte[byte1.length + byte2.length];
        System.arraycopy(byte1, 0, byte3, 0, byte1.length);
        System.arraycopy(byte2, 0, byte3, byte1.length, byte2.length);
        return byte3;
    }

    public String getUploadSignature() throws Exception {
        String strSign = "";
        String contextStr = "";

        long endTime = (currentTime + signValidDuration);
        contextStr += "secretId=" + java.net.URLEncoder.encode(secretId, "utf8");
        contextStr += "&currentTimeStamp=" + currentTime;
        contextStr += "&expireTime=" + endTime;
        contextStr += "&random=" + random;

        try {
            Mac mac = Mac.getInstance(HMAC_ALGORITHM);
            SecretKeySpec secretKey = new SecretKeySpec(this.secretKey.getBytes(CONTENT_CHARSET), mac.getAlgorithm());
            mac.init(secretKey);

            byte[] hash = mac.doFinal(contextStr.getBytes(CONTENT_CHARSET));
            byte[] sigBuf = byteMerger(hash, contextStr.getBytes("utf8"));
            strSign = new String(new BASE64Encoder().encode(sigBuf).getBytes());
            strSign = strSign.replace(" ", "").replace("\n", "").replace("\r", "");
        } catch (Exception e) {
            throw e;
        }
        return strSign;
    }

    public void setSecretId(String secretId) {
        this.secretId = secretId;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    public void setCurrentTime(long currentTime) {
        this.currentTime = currentTime;
    }

    public void setRandom(int random) {
        this.random = random;
    }

    public void setSignValidDuration(int signValidDuration) {
        this.signValidDuration = signValidDuration;
    }
}

Signature.java

  目录结构

  

  上传封面只需在qcVideo.ugcUploader.start()方法中添加coverFile:coverFile并指定文件便可

  为使视频文件和封面文件一同上传,可添加Button按钮作为上传按钮并添加点击事件upload()

    <form>
        <!-- 添加视频 -->
        <input id="addVideo-file" onchange="addVideo(this)" type="file" style="display: none;">
        <!-- 添加封面 -->
        <input id="addCover-file" onchange="addCover(this)" type="file" style="display:none;">
    </form>

    <h1>上传视频+封面</h1>
    <!-- 添加视频 -->
    <a id="addVideo" onclick="videoClick()" href="javascript:void(0)">上传视频</a>
    <!-- 添加封面 -->
    <a id="addCover" onclick="coverClick()" href="javascript:void(0)">上传封面</a>
    <!-- 上传按钮 -->
    <a id="upload" onclick="upload()" href="javascript:void(0)">确定上传</a>
        //上传按钮
        function upload()
        {
            //提示信息
            addUploaderMsgBox();
            startUploader();
        }

  核心代码

var startUploader = function()
        {
            //上传视频的核心
            qcVideo.ugcUploader.start({
                //视频
                videoFile:videoFile,
                //封面
                coverFile:coverFile,

                getSignature:getSignature,
                allowAudio:1,
                //文件上传成功后
                success:function(result)
                {
                    //alert("success")
                    $(‘[name=videoresult]‘).text(‘上传成功‘)
                },
                //文件上传失败后
                error:function(result)
                {
                    $(‘[name=videoresult]‘).text(‘上传失败‘)
                },
                //正在上传过程中会一直调用的Update
                progress:function(result)
                {
                    $(‘[name=videoname]‘).text(result.name)
                    $(‘[name=videosha]‘).text(Math.floor(result.shacurr*100)+"%")
                    $(‘[name=videocurr]‘).text(Math.floor(result.curr*100)+"%")
                },
                //上传完成
                finish:function(result)
                {
                    $(‘[name=videourl]‘).text(result.videoUrl)
                }

            })
        }

  

原文地址:https://www.cnblogs.com/1138720556Gary/p/10350221.html

时间: 2024-10-26 07:13:57

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

行业云服务——乐视云点播服务试用体验

面向特定行业的云服务逐渐成为热点.可以说行业云服务把云计算推向了一个更高的层次——从具体的业务领域入手进行功能设计,将底层的技术实现细节屏蔽掉,向最终用户暴露业务层面的操作界面或API. 最近一段时间,媒体云炒的风风火火,七牛.腾讯.乐视等纷纷推出了媒体/视频云服务,包括:直播(互动直播).点播.视频处理等.微软的Windows Azure也提供了Media Service服务,而且宣称Media Service为索契冬奥会提供了网络视频直播服务. 乐视云目前并没有开放太多功能:云点播.云直播.

nginx视频直播/点播服务干货分享

近年互联网直播业务非常火热.我也研究了下,发现nginx上配置视频直播点播也很容易实现,特分享一下.一.ubuntu14.04安装nginx及nginx_rtmp_module扩展 nginx根据是否已安装和安装的方式不同,有一下三种方式安装及扩展安装.1.全新安装nginx和nginx_rtmp_module扩展 #!/bin/sh apt-get update apt-get install -y gcc libpcre3 libpcre3-dev openssl libssl-dev ma

使用腾讯证书服务为Centos7+Apache申请颁发证书

说到证书我们大家都知道,证书可以提高数据加密传输,但是提到证书服务的供应商,相对比较多可以根据自己的需求来定,今天我们使用腾讯的云服务平台中的证书服务来为Centos7下的Apache服务申请及分配证书,现在的第三方证书服务都现在都简化了,无需提供csr文件即可生成证书及私钥文件,所以我们无需申请相关的csr证书申请文件了,还需要注意此次过程中,我们需要有自己有公网域名,因为在申请证书的时候需要验证.具体见下: 腾讯云服务地址:https://console.qcloud.com/ 我们首先需要

5G与云服务:未来云上的娱乐蓝图

5G与云服务:未来云上的娱乐蓝图 或许,许很多人还能记得,上个世纪还没有网络时,人们的娱乐生活离不开各种歌舞厅.台球厅以及游戏厅.随着互联网的兴起,随之而来的是网络文学和Flash的大火.台式机的普及和网速的进一步提升,带来了视频网站的蓬勃发展. Z世代占据主导的移动互联网随着社交媒体一起,将生活与娱乐的界限进一步打破,云音乐.短视频.二次元和朋友圈是当下的进行时. “一切文化内容都心甘情愿地成为娱乐的附庸,而且毫无怨言,甚至毫无声息.”——尼尔波兹曼<娱乐至死> 这本书出版于电视开始风靡的时

Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止

就这段时间,很多人在抱怨为什么自己的MySQL又打不开问题. 就“Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止”这个问题,我想到了几种方案解决: 一.首先在windows的服务中确定mysql服务是否开启, 如果你在windows的服务中找不到mysql的服务,这时你需要安装mysql服务. 安装过程可以使用命令行的形式,输入下面的命令,5.1之后的版本的命令:>> mysqld.exe -install(这里我在path设置的MySQL安装文件

本地计算机 上的 Redis Server 服务启动后停止

服务器上Redis服务安装正常..却启动不了.. 报错  :   本地计算机 上的 Redis Server 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止. 最后发现是Redis的配置文件有错..因为我这里是在其他机器上配置好..修改完conf文件..直接把文件复制过去覆盖的..配置的路径不一样..或者其他配置问题.. 每一个conf文件中都有三个实体路径..都需要修改.. 苦恼了半天..最后终于解决..Redis可以正常启动了..

使用Azure上的Azure AD服务管理Office 365账户(无缝打通Azure和Office 365)

Office 365的各个组件运行在Azure AD服务至上,但是在Office 365上面,对账户底层的访问,操作权限有限,整合Azure服务.Office 365.企业内部系统看上去会很困难. 通过这一篇我们,我们可以发现在Azure上面直接调用Office 365的目录服务,无需开发就可以达到Azure上面的应用,都可以访问并使用Office 365账户,只需要将Office 365 和本地做ADFS联盟服务,这样就将Azure上.企业内.和Office 365上所有的应用全部打通了,都基

TBS 腾讯浏览服务 集成

腾讯浏览服务-首页  http://x5.tencent.com/ 官方文档不多,不过实例比较详细,配置和谷歌的Webview差不多,Webview有的方法,TBS也都有. jar包不到300KB,但是它需要X5内核,需要另外下载,不过如果手机装了微信QQ,就可以用它们的了. 把下载jar包添加到项目 在Application添加 public class App extends Application { @Override public void onCreate() { super.onC

跟我学习dubbo-在Linux操作系统上手工部署Dubbo服务(5)

在Linux操作系统上手工部署Dubbo服务 1.环境变量配置 Java环境变量----只需要JRE vi /etc/profile ## java env export JAVA_HOME=/usr/local/java/jdk1.7.0_72 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/li/tools.jar:$JRE_HOME/lib/rt.jar export PA