您的位置:首页 > 编程语言 > Java开发

hjr-JAVA:WEB支持任意格式视频播放

2018-02-02 12:48 846 查看
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);

4000
$("#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐