最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

全球速递!视频上传及压缩SpringBoot篇上

来源:博客园


(相关资料图)

在SpringBoot项目中实现视频的上传和下载,地址都是存放至阿里云的,但是由于视频数量越来越多占用的内存也越来越大,导致服务器内存不足,公司为了减少服务器开支,要求我们研发人员把最好把内存利用到极致,尽量减少不必要的浪费,所以就需要把视频进行压缩。

一、定义视频上传请求接口

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

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

关键词: 视频压缩 最后出现 服务器内存