概述:

很多用户使用七牛的云存储服务,存放很多mp4文件到七牛的存储空间,但是通过复制外链,然后在浏览器中播放,经常会遇到“只有音频,没有视频”的情况;
其实这个不是七牛的存储有问题,而是视频的编码方式,浏览器不支持,如:MPEG-4 在googel Chrome 、IE这些浏览器中都是不支持视频播放的,但通过苹果的Safari浏览器是能正常播放的;

思路:
1.上传一个视频到七牛的空间,然后再进行转码操作;
2,上传的同时指定预处理操作,进行转码处理后,上传;
3.查看七牛的avthumb接口说明和支持的编码说明,链接如下:
http://developer.qiniu.com/code/v6/api/dora-api/av/avthumb.html
https://support.qiniu.com/hc/kb/article/182142/?from=draft

第一种方法,代码示例如下:

package com.qiniu.dora;import com.qiniu.base.AccountMgr;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.processing.OperationManager;
import com.qiniu.storage.Configuration;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import com.qiniu.util.UrlSafeBase64;/*** 很多浏览器不支持 MPEG-4编码的视频,所以上传到七牛,用类似google 这样的浏览器是不能正常播放的,只有音频,没有视频* 所以可以使用七牛的转码接口* * @author xuhuanchao**/
public class AVthumbForMpeg4 {//获取授权对象Auth auth = Auth.create(AccountMgr.ACCESS_KEY, AccountMgr.SECRET_KEY);//执行操作的管理对象OperationManager operationMgr = new OperationManager(auth, new Configuration(Zone.zone0()));/*** Test Method* @param args*/public static void main(String[] args) {new AVthumbForMpeg4().transcoding();}/*** 转码*/void transcoding() {String bucket = "java-bucket";          //存储空间名称String key = "mpeg_4_type.mp4";         //存储空间中视频的文件名称String newKey = "H264_type.mp4";        //转码后,另存的文件名称String pipeline = "admin_merge_radio";  //处理队列String saveAs = UrlSafeBase64.encodeToString(bucket + ":" + newKey);        //saveas接口 参数String fops = "avthumb/mp4/vcodec/libx264|saveas/" + saveAs;                //处理命令 avthumb 和 saveas 通过管道符 |  进行连接try {//执行转码和另存 操作String persistentId = operationMgr.pfop(bucket, key, fops, new StringMap().put("persistentPipeline", pipeline));System.out.println(persistentId);} catch (QiniuException e) {String errorCode = String.valueOf(e.response.statusCode);System.out.println(errorCode);e.printStackTrace();}}
}

第二种方法,代码示例如下:

import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import com.qiniu.util.UrlSafeBase64;import java.io.IOException;import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.UploadManager;public class UploadDemo {//设置好账号的ACCESS_KEY和SECRET_KEYString ACCESS_KEY = "Access_Key";String SECRET_KEY = "Secret_Key";//要上传的空间String bucketname = "Bucket_Name";//上传到七牛后保存的文件名String key = "my-java.png";//上传文件的路径String FilePath = "/.../...";//设置转码操作参数String fops = "avthumb/mp4/s/640x360/vb/1.25m";//设置转码的队列String pipeline = "yourpipelinename";//可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间。String urlbase64 = UrlSafeBase64.encodeToString("目标Bucket_Name:自定义文件key");String pfops = fops +"|saveas/"+ urlbase64;//密钥配置Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);//创建上传对象UploadManager uploadManager = new UploadManager();//上传策略中设置persistentOps字段和persistentPipeline字段public String getUpToken(){return auth.uploadToken(bucketname,null,3600,new StringMap().putNotEmpty("persistentOps", pfops).putNotEmpty("persistentPipeline", pipeline), true);}public void upload() throws IOException{try {//调用put方法上传Response res = uploadManager.put(FilePath, null, getUpToken());//打印返回的信息System.out.println(res.bodyString()); } catch (QiniuException e) {Response r = e.response;// 请求失败时打印的异常的信息System.out.println(r.toString());try {//响应的文本信息System.out.println(r.bodyString());} catch (QiniuException e1) {//ignore}}       }public static void main(String args[]) throws IOException{  new UploadDemo().upload();}}注:上面的Demo只是针对视频转码,如果需要别的功能比如音视频切片、视频截图、视频拼接只需要修改下上面的fops后面的参数就可以了,
eg: fops = "vframe/jpg/offset/1/w/480/h/360/rotate/90"就表示视频截图了。
下面给出一些常见的数据处理功能,可以根据需要进行选择:
//------------------图片缩放-------------------
fops ="imageView/2/w/200/h/200";//------------------视频转码-------------------
// fops ="avthumb/flv/vb/229k/vcodec/libx264/noDomain/1";//------------------图片水印-------------------
String pictureurl = UrlSafeBase64.encodeToString("http://developer.qiniu.com/resource/logo-2.jpg");
fops = "watermark/1/image/" + pictureurl;//------------------视频切片-------------------
fops = "avthumb/m3u8";
//切片与加密参数
fops = "avthumb/m3u8/vb/640k/hlsKey/MDEyMzQ1Njc4OTEyMzQ1Ng==/hlsKeyUrl/aHR0cDovLzd4bGVrYi5jb20yLnowLmdsYi5xaW5pdWNkbi5jb20vcWluaXV0ZXN0LmtleQ==";//------------------文档转换-------------------
fops = "yifangyun_preview";//------------------视频截图-------------------
fops = "vframe/jpg/offset/1/w/480/h/360/rotate/90";//------------------视频拼接-------------------
//拼接视频片段时要保证所有源的画面长宽值一致
//除去作为数据处理对象的源文件以外,还可以指定最多5个源文件(即总计6个片段)
//所有源文件必须属于同一存储空间
//格式:avconcat/<Mode>/format/<Format>/<encodedUrl0>/<encodedUrl1>/<encodedUrl2>/...
String encodedUrl1 = UrlSafeBase64.encodeToString("http://7xl4c9.com1.z0.glb.clouddn.com/pingjie2.flv");
String encodedUrl2 = UrlSafeBase64.encodeToString("http://7xl4c9.com1.z0.glb.clouddn.com/pingjie3.avi");
fops = "avconcat/2/format/mp4/"+encodedUrl1+encodedUrl2;//------------------多文件压缩-------------------
//可将若干七牛空间中的资源文件,在七牛服务端压缩后存储
//格式:mkzip/<mode>/url/<Base64EncodedURL>/alias/<Base64EncodedAlias>/url/<Base64EncodedURL>
String encodedfile1 = UrlSafeBase64.encodeToString("http://7xl4c9.com1.z0.glb.clouddn.com/photo1.jpg");
String encodedfile2 = UrlSafeBase64.encodeToString("http://7xl4c9.com1.z0.glb.clouddn.com/vedio1.mp4");
String encodedfile3 = UrlSafeBase64.encodeToString("http://7xl4c9.com1.z0.glb.clouddn.com/audio1.mp3");
fops = "mkzip/2/url/"+encodedfile1+"url/"+encodedfile2+"url/"+encodedfile3;

补充说明案例:

页面ajax

 <input type="file" class="form-control" name="file" id="filedata" placeholder="upload"style="margin-bottom:5px;"><button onclick="uploadfile(this);">上传视频文件</button><input type="hidden" class="form-control" name="videoUrl" id="urlId" placeholder="请输入视频链接"style="margin-bottom:5px;"><span id="isfile"></span><div id="successAlertFile" class="alert alert-success"style="display:none;"><span id="successAlertFile_msg"></span></div>function uploadfile(el) {var formData = new FormData();var file = $(el).siblings().filter('#filedata').prop('files')[0];formData.append("file", $(el).siblings().filter('#filedata').prop('files')[0]);if(file != null && file != ''){if (file.size < 104857600) {$.ajax({url: '${s.base}/video/upload.html',type: 'POST',data: formData,processData: false, // 不要对data参数进行序列化处理,默认为truecontentType: false, // 不要设置Content-Type请求头,因为文件数据是以 multipart/form-data 来编码xhr: function () {myXhr = $.ajaxSettings.xhr();if (myXhr.upload) {myXhr.upload.addEventListener('progress', function (e) {if (e.lengthComputable) {var percent = Math.floor(e.loaded / e.total * 100);$(el).siblings().filter('#isfile').html(percent.toString() + '%');if (percent == 100) {$(el).siblings().filter('#isfile').html("正在上传:" + "<img src='${s.base}/res/i/loading.gif'/>");}}}, false);}return myXhr;},success: function (respText) {var resp = $.parseJSON(respText);if (resp.errcode == 0) {console.log(resp,"---success----");$(el).siblings().filter('#isfile').html('');$(el).siblings().filter('#successAlertFile').show().fadeOut(3000);//显示模态框$(el).siblings().filter('#successAlertFile').children().css('color', 'green').html('上传成功!');$(el).siblings().filter('#urlId').val(resp.data.path);} else {$(el).siblings().filter('#successAlertFile').show().fadeOut(3000);$(el).siblings().filter('#successAlertFile').children().css('color', 'red').html('文件名称重复,请重新上传!');$(el).siblings().filter('#isfile').html('');}},error: function (res) {// 请求失败console.log(res);$(el).siblings().filter('#successAlertFile').show().fadeOut(3000);$(el).siblings().filter('#successAlertFile').children().css('color', 'red').html('上传失败,请重新上传!');$(el).siblings().filter('#isfile').html('');}});} else {$(el).siblings().filter('#successAlertFile').show().fadeOut(3000);$(el).siblings().filter('#successAlertFile').children().css('color', 'red').html('上传视频不能大于100MB!');}} else {$(el).siblings().filter('#successAlertFile').show().fadeOut(3000);$(el).siblings().filter('#successAlertFile').children().css('color', 'red').html('上传视频不能为空!');}/* var demo =  $(el).siblings().filter('#urlId').val()console.log(demo,"----demo---")*/}

controller

  package com.online.college.opt.controller;import com.online.college.common.storage.QiniuStorage;
import com.online.college.common.web.JsonView;
import com.online.college.core.consts.domain.CollegeClassTeacher;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.servlet.ModelAndView;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/*** @Author: LBX* @Date: 2018/12/24 14:07*/
@Controller
@RequestMapping("/video")
public class UploadFileController {@RequestMapping("/upload")@ResponseBodypublic String upload(@RequestParam("file") CommonsMultipartFile picture){Map<String,Object> map = new HashMap<>();if (null != picture && picture.getBytes().length > 0) {String key = QiniuStorage.uploadVideo(picture);map.put("key",key);}return JsonView.render(map);}
}

service

  /*** 上传视频* @param picture*/public static String uploadVideo(CommonsMultipartFile picture){String key = QiniuKeyGenerator.generateKey();key = QiniuWrapper.uploadVideo(picture, key);return key;}

serviceimpl

  /*** 上传视频** @return*/public static String uploadVideo(CommonsMultipartFile picture, String key) {DiskFileItem diskFileItem = (DiskFileItem) picture.getFileItem();File file = diskFileItem.getStoreLocation();try {String fileName = picture.getOriginalFilename();//设置转码操作参数String fops = "avthumb/mp4/vcodec/libx264";//可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间。String urlbase64 = UrlSafeBase64.encodeToString(bucketName + ":" + fileName + ".mp4");String pfops = fops + "|saveas/" + urlbase64;String upToken = auth.uploadToken(bucketName, null, 3600, new StringMap().putNotEmpty("persistentOps", pfops));key = key + ".mp4";//调用put方法上传Response response = uploadManager.put(file, key, upToken);//打印返回的信息System.out.println("-----success---" + response.bodyString());DefaultPutRet ret = response.jsonToObject(DefaultPutRet.class);return ret.key;} catch (QiniuException e) {logger.error("upload file to qiniu cloud storage failed", e);}return null;}

七牛云上传视频并转码相关推荐

  1. 七牛云 转码_七牛上传视频并转码

    /// ///上传视频到七牛并转码/// /// /// public static void UpLoadVideo(string saveKey, stringlocalFile) { Mac m ...

  2. 七牛云上传视频如何有效做到节省空间

    在上传视频的时候,我们通常会保存到第三方[七牛云]平台.不过大多数程序员在系统后台上传视频后,一般都是保存到了本地,如果视频非常多或者视频容量特别大的情况下,那么我们的服务器迟早有一天会满,为了节省空 ...

  3. html5视频上传云,vue+七牛云上传视频文件

    Qiniu-JavaScript-SDK基于七牛云存储官方 API 构建,其中上传功能基于 H5 File API.开发者基于 JS-SDK 可以方便的从浏览器端上传文件至七牛云存储,并对上传成功后的 ...

  4. PHP七牛云上传大视频文件异步存为m3u8格式(包括回调过程)

    问题引入 视频的第一帧加载缓慢. 简介 HTTP Live Streaming,缩写为HLS,是由苹果公司提出基于HTTP的流媒体网络传输协议.它的工作原理是把整个流分成一个个小的基于HTTP的文件来 ...

  5. 七牛云上传头像出现 401 错误和跨域问题 | 大别山码将

    使用七牛云上传头像时出现以下问题 报错内容: 询问被告知上传路径不对,华南,华东地域是不一样的,于是我想到之前图片上传成功是因为我在华南,七牛云区域也设置的华南,现在我在华东了,那应该是设置成华东就能 ...

  6. uni-app 七牛云上传文件

    关注我的哔哩哔哩哦 https://space.bilibili.com/309103931 哔哩哔哩文章链接https://www.bilibili.com/read/cv5072498 七牛云上传 ...

  7. 七牛云上传截图后的base64位遇到的问题总结

    最近公司内部项目遇到上传base64位图片到七牛云,并且自定义key存储,在解决过程遇到很多问题,但是最终经过请教,都得到结果,故在这里总结一下... 官方文档 1,布局代码如下: <div c ...

  8. 七牛云上传资源和拉取

    一.七牛云存储介绍 七牛云存储,是非常流行的用户存储图片 视频 音频 等文件的存储方式,可以大大的降低用户请求对我们自己服务器的查询压力, 能有效的提高网页的打开速度,使用户获取更好的使用体验. 二. ...

  9. kindeditor php教程,kindeditor 加入七牛云上传的实例讲解

    七牛云上传主要有两种: 服务端上传 前端上传,前端又分两种返回方式: 1).重定向返回,可以解决ajax跨域的问题 2).回调返回,七牛云先向服务端要返回数据,再由七牛云返回前端,解决不支持重定向的请 ...

最新文章

  1. 王道计算机考研 数据结构 (图-上)
  2. linux libpcap 效率,Linux ubuntu PF_RING+libpcap 极速捕获千兆网数据包,不丢包
  3. java中容易混淆的方法_java中容易混淆的概念
  4. scrapy 安装技巧
  5. java Enumset
  6. [Nginx]nginx 配置实例-负载均衡
  7. [Flex]Flex 3.0 and Adobe AIR 1.0正式版发布!
  8. 《人月神话》阅读体会(三)
  9. js获取php多维数组,vue.js,多维数组_vuejs2.0 多维数组操作?,vue.js,多维数组 - phpStudy...
  10. 神州炫龙蓝天刷bios教程(百分百成功/不成功下面留言)
  11. 自己动手做一个爬虫项目
  12. 汉诺塔递归算法python详细解析图_汉诺塔递归算法的图解(自我总结)
  13. 图灵大会圆满落幕,码隆科技与全球最强大脑同台
  14. 约分最简分式(python)
  15. css 小尖角,css如何实现气泡的小尖角效果 css实现气泡的小尖角效果代码示例
  16. 李春葆《数据结构》第五版
  17. W: Possible missing firmware /lib/firmware/i915/skl_guc_49.0.1.bin for module i915
  18. Temporary failure in name resolution错误解决方法
  19. 四则运算4(Android版)
  20. 又被黑!百度到底做错了什么?

热门文章

  1. 工具及方法 - 斗地主技巧
  2. window系统命令行切换当前目录
  3. 算法——和为K的连续子数组
  4. python xlsx表格最大行最大列
  5. 记录一次紫狐Rootkit应急响应过程
  6. 小繁的Binary_Indexed_Tree学习笔记
  7. BFT-SMaRt:用Netty做客户端的可靠信道
  8. AMD锐龙7000系列CPU命名混乱?三分钟帮你看明白
  9. Linux路由器的配置
  10. 【HISI系列】海思媒体处理平台架构分析