ffmpeg视频上传及压缩SpringBoot篇上
2023-03-31 10:35:58 时间
在SpringBoot项目中实现视频的上传和下载,地址都是存放至阿里云的,但是由于视频数量越来越多占用的内存也越来越大,导致服务器内存不足,公司为了减少服务器开支,要求我们研发人员把最好把内存利用到极致,尽量减少不必要的浪费,所以就需要把视频进行压缩。
上传前要先下载ffmpeg软件,这个软件会执行压缩命令,百度上可搜索到直接下载
一、定义视频上传请求接口
public AjaxResult videoUploadFile(MultipartFile file){
try {
if(null == file || file.isEmpty()){
return AjaxResult.error("文件为空");
}
String ossFilePrefix = StringUtils.genUUID();
String fileName = ossFilePrefix +"-"+ file.getOriginalFilename();
String fileurl = AliOssUtils.videoUploadFile(file,fileName);
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", "after_"+fileName);
ajax.put("url", fileurl);
return ajax;
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
二、视频暂存至本地文件夹
public static final String uploadVideo(String baseDir, MultipartFile file, String fileName) throws FileSizeLimitExceededException, IOException {
File desc = getAbsoluteFile(baseDir, fileName);
file.transferTo(desc);
String pathFileName = getPathFileName(baseDir, fileName);
return pathFileName;
}
三、开始压缩视频
public static boolean toCompressFile(String convertFile,String targetFile){
try{
/**将视频压缩为 每秒15帧 平均码率600k 画面的宽与高 为1280*720*/
String cutCmd="ffmpeg -i " + convertFile + " -r 15 -b:v 600k -s 1280x720 "+ targetFile;
log.info("cutCmd: " + cutCmd);
runCmd(cutCmd);
log.info("文件:"+convertFile+" 视屏压缩完成");
}catch(Exception e){
e.printStackTrace();
log.info("压缩文件出现异常:"+e.getMessage());
return false;
}
return true;
}
四、上传至阿里云并获取压缩后的视频路径
private static String getFileUrl(String path) throws IOException {
File file = new File(path);
FileInputStream fileInputStream = new FileInputStream(file);
MultipartFile multipartFile1 = new MockMultipartFile(file.getName(), file.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
uploadFile(multipartFile1, file.getName());
String url = getUrl(file.getName());
return url;
}
五、核心调用
public static String videoUploadFile(MultipartFile multipartFile, String fileName) throws IOException {
//存放路径
String filePath = FileUploadUtils.uploadVideo(getDefaultBaseDir(), multipartFile, fileName);
String convertFile = filePath.replace("/profile", getDefaultBaseDir()).replaceAll("//", "/");
//字符串第一个字符最后出现的下标
int lastIndex = convertFile.lastIndexOf("/");
StringBuilder sb = new StringBuilder(convertFile);
String convertFile1 = sb.insert(lastIndex + 1, "after_").toString();
boolean flag = toCompressFile(convertFile, convertFile1);
if (!flag) {
throw new CustomException("文件压缩出现异常");
}
//读取压缩后的文件并上传至阿里云
String url = getFileUrl(convertFile1);
//删除本地暂存文件
FileUtils.deleteFile(convertFile);
log.info("文件:" + convertFile + " 删除成功");
FileUtils.deleteFile(convertFile1);
log.info("文件:" + convertFile1 + " 删除成功");
return url;
}
六、spring boot的yml配置文件
修改application.yml文件:
spring:
servlet:
mvc:
async:
request-timeout: 2000000
修改application-prd.yml文件:
spring:
servlet:
multipart:
max-file-size: 1024MB
max-request-size: 1024MB
视频上传至阿里云这一块代码没有贴出来,每个项目都大同小异,可根据自己项目实际情况做调整,这篇最核心的是视频压缩的方法及思路。
相关文章
- 一篇运维老司机的大数据平台监控宝典(2)-联通大数据集群平台监控体系详解
- 一篇运维老司机的大数据平台监控宝典(1)-联通大数据集群平台监控体系进程详解
- 空中换引擎 博时基金数字化转型经验谈
- 如何高效地学习编程语言
- 作为一名阿里巴巴数据分析大牛,送给学弟学妹的经验积分
- 为什么要学习R语言
- Hadoop大数据分析平台的介绍性讨论
- 最全面的Spring学习笔记
- 16个用于数据科学和机器学习的顶级平台
- 给有抱负的数据科学家的六条建议
- 如何做一枚合格的数据产品经理
- 除Kaggle外,还有哪些顶级数据科学竞赛平台
- 一个鲜为人知却可以保护隐私的训练方法:联合学习
- 干货 :送你12个关于数据科学学习的关键提示(附链接)
- 大数据行业有多少种工作岗位,各自的技能需求是什么?
- 中国移动研究院常耀斌:商用大数据平台的研发之路
- 这些数据科学家必备的技能,你拥有哪些?
- 自学成才的开发者有何优势和劣势?
- Gartner报告:正处于数据科学与机器学习工具 “大爆炸”的时代
- Ready Computing借助InterSystems IRIS医疗版为医疗机构提供具有高度互操作性和可扩展性的解决方案