hjr-JAVA:WEB支持任意格式視頻播放

web瀏覽器目前用h5 標籤即可,只支持特定編碼的mp4。
用戶很多時候不會轉碼操作,所以在上傳的時候,應在在線自動轉碼
上傳資源一般都存到第三方,存到自己服務器太佔空間,在上傳同時把視頻在線轉碼爲web mp4即可,比如阿里,七牛都有這種服務
如七牛:
建議上傳部分用純前端實現,包括分片上傳,只需設置一個參數即可

var uploader = Qiniu.uploader({
        runtimes: 'html5,flash,html4',      // 上傳模式,依次退化
        browse_button: 'pickfiles',         // 上傳選擇的點選按鈕,必需
        // 在初始化時,uptoken,uptoken_url,uptoken_func三個參數中必須有一個被設置
        // 切如果提供了多個,其優先級爲uptoken > uptoken_url > uptoken_func
        // 其中uptoken是直接提供上傳憑證,uptoken_url是提供了獲取上傳憑證的地址,如果需要定製獲取uptoken的過程則可以設置uptoken_func
        // uptoken : '<Your upload token>', // uptoken是上傳憑證,由其他程序生成
         uptoken_url: $("#basePath").val()+'upload/uploadDocToken.do',         // Ajax請求uptoken的Url,強烈建議設置(服務端提供)
        // uptoken_func: function(file){    // 在需要獲取uptoken時,該方法會被調用
        //    // do something
        //    return uptoken;
        // },
        get_new_uptoken: true,             // 設置上傳文件的時候是否每次都重新獲取新的uptoken
        // downtoken_url: '/downtoken',
        // Ajax請求downToken的Url,私有空間時使用,JS-SDK將向該地址POST文件的key和domain,服務端返回的JSON必須包含url字段,url值爲該文件的下載地址
        unique_names: false,              // 默認false,key爲文件名。若開啓該選項,JS-SDK會爲每個文件自動生成key(文件名)
        save_key: true,                  // 默認false。若在服務端生成uptoken的上傳策略中指定了sava_key,則開啓,SDK在前端將不對key進行任何處理
        dragdrop: true,
        domain: domainPara+"/",     // bucket域名,下載資源時用到,必需
        container: 'container',             // 上傳區域DOM ID,默認是browser_button的父元素
        max_file_size: '500mb',             // 最大文件體積限制
        flash_swf_url: 'admin/assets/js/plupload-2.1.1/Moxie.swf',  //引入flash,相對路徑
//        max_retries: 0,                     // 上傳失敗最大重試次數
//        dragdrop: true,                     // 開啓可拖曳上傳
        drop_element: 'container',          // 拖曳上傳區域元素的ID,拖曳文件或文件夾後可觸發上傳
        chunk_size: '4mb',                  // 分塊上傳時,每塊的體積
        auto_start: false,                   // 選擇文件後自動上傳,若關閉需要自己綁定事件觸發上傳
        log_level: 5,
        filters: {
              mime_types : [ //只允許上傳圖片和zip文件
                { title : "office files", extensions : "doc,docx" },
              ],
              max_file_size : '20mb', //最大隻能上傳400kb的文件
              prevent_duplicates : true //不允許選取重複文件
        },
        init: {
            'FilesAdded': function(up, files) {
                plupload.each(files, function(file) {
                    // 文件添加進隊列後,處理相關的事情
                    if(progressDiv){
                        progressDiv.closeDiv(progressDiv.closeUp[0]);
                    }
                    progressDiv = getPDiv();
                    progressDiv.setTitle(file.name);
                    $("#sourceState").val(file.name+",已選擇");
                    $("#pickfiles").after(progressDiv.getProgress());
                });
            },
            'BeforeUpload': function(up, file) {
                   // 每個文件上傳前,處理相關的事情
            },
            'UploadProgress': function(up, file) {
                   // 每個文件上傳時,處理相關的事情
                progressDiv = getPDiv();
                progressDiv.setPercent(file.percent);
                progressDiv.setPercentTitle(file.percent);
            },
            'FileUploaded': function(up, file, info) {
                   // 每個文件上傳成功後,處理相關的事情
                   // 其中info是文件上傳成功後,服務端返回的json,形式如:
                   // {
                   //    "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
                   //    "key": "gogopher.jpg"
                   //  }
                   // 查看簡單反饋
                   var domain = up.getOption('domain');
                   var res = $.parseJSON(info);
                   var sourceLink = domain + res.key; // 獲取上傳成功後的文件的Url
                   $("#sourceState").val(file.name+"已上傳");
                   $("#sourceLink").val(sourceLink);
                   $("#quesViewUrl").val(sourceLink);
                   progressDiv.closeDiv(progressDiv.closeUp[0]);
            },
            'Error': function(up, err, errTip) {
                   //上傳出錯時,處理相關的事情
                   $("#sourceState").val("上傳失敗");
            },
            'UploadComplete': function() {
                   //隊列文件處理完畢後,處理相關的事情
            },
//            'Key': function(up, file) {
//                // 若想在前端對每個文件的key進行個性化處理,可以配置該函數
//                // 該配置必須要在unique_names: false,save_key: false時才生效
//                var key = "";
//                // do something with key here
//                return key
//            }
        }
    });

後端做兩件事,提供token和提供轉碼接口
必須設置的幾個屬性



qiniu.tokenutil.ak = **************
qiniu.tokenutil.sk = **************
#上面兩個註冊賬號後在後臺獲取
qiniu.tokenutil.bucket = ***
#bucket是存儲視頻的網盤名字
#qiniu.tokenutil.expireSeconds = 3600

#qiniu.tokenutil.domain = http://www.xxx.com
#domain是預覽視頻的網址前綴

提供token的接口按照說明文檔寫就行。
轉碼接口,參數是文件名字,比如1232131.flv

@RequestMapping(value="/zhuanma",method = RequestMethod.GET,produces="application/json")
    @ResponseBody
    public String zhuanma(String fileName) throws XhException {
        if(fileName == null)
        {
            return "文件名不能爲空!";
        }
        String accessKey = PropertiesUtil.getQiniuValue("qiniu.tokenutil.ak");
        String secretKey = PropertiesUtil.getQiniuValue("qiniu.tokenutil.sk");
        String bucket = PropertiesUtil.getQiniuValue("qiniu.tokenutil.bucket");
        String key = fileName;
        Auth auth = Auth.create(accessKey, secretKey);
        String persistentOpfs = "avthumb/mp4/ab/160k/ar/44100/acodec/libfaac/r/30/vb/2200k/vcodec/libx264/s/1280x720/autoscale/1/stripmeta/0";
        String saveas_key = UrlSafeBase64.encodeToString(bucket+":"+key+"-zhuanma");
        persistentOpfs = persistentOpfs+"|saveas/"+saveas_key;
        String persistentPipeline = "zhuanma";
        String persistentNotifyUrl = "http://api.example.com/qiniu/pfop/notify";
        Configuration cfg = new Configuration(Zone.zone0());
        OperationManager operationManager = new OperationManager(auth, cfg);
        String persistentId = "";
        try {
            persistentId = operationManager.pfop(bucket, key, persistentOpfs, persistentPipeline, persistentNotifyUrl, true);
            System.out.println(persistentId);
            OperationStatus operationStatus = operationManager.prefop(persistentId);
        } catch (QiniuException e) {
            System.err.println(e.response.toString());
        }
        return persistentId;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章