百木园-与人分享,
就是让自己快乐。

ffmpeg视频上传及压缩SpringBoot篇上

  在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

视频上传至阿里云这一块代码没有贴出来,每个项目都大同小异,可根据自己项目实际情况做调整,这篇最核心的是视频压缩的方法及思路。


来源:https://www.cnblogs.com/izmm/p/17174508.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » ffmpeg视频上传及压缩SpringBoot篇上

相关推荐

  • 暂无文章