Springboot實現(xiàn)視頻上傳及壓縮功能
在SpringBoot項目中實現(xiàn)視頻的上傳和下載,地址都是存放至阿里云的,但是由于視頻數(shù)量越來越多占用的內(nèi)存也越來越大,導致服務(wù)器內(nèi)存不足,公司為了減少服務(wù)器開支,要求我們研發(fā)人員把最好把內(nèi)存利用到極致,盡量減少不必要的浪費,所以就需要把視頻進行壓縮。
一、定義視頻上傳請求接口
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("壓縮文件出現(xiàn)異常:"+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;
}五、核心調(diào)用
public static String videoUploadFile(MultipartFile multipartFile, String fileName) throws IOException {
//存放路徑
String filePath = FileUploadUtils.uploadVideo(getDefaultBaseDir(), multipartFile, fileName);
String convertFile = filePath.replace("/profile", getDefaultBaseDir()).replaceAll("http://", "/");
//字符串第一個字符最后出現(xiàn)的下標
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("文件壓縮出現(xiàn)異常");
}
//讀取壓縮后的文件并上傳至阿里云
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
視頻上傳至阿里云這一塊代碼沒有貼出來,每個項目都大同小異,可根據(jù)自己項目實際情況做調(diào)整,這篇最核心的是視頻壓縮的方法及思路。
到此這篇關(guān)于Springboot實現(xiàn)視頻上傳及壓縮功能的文章就介紹到這了,更多相關(guān)Springboot視頻上傳壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis plus自動生成代碼tinyint(1)自動轉(zhuǎn)換為Boolean的問題及解決
這篇文章主要介紹了mybatis plus自動生成代碼tinyint(1)自動轉(zhuǎn)換為Boolean的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
淺談Java8 的foreach跳出循環(huán)break/return
這篇文章主要介紹了Java8 的foreach跳出循環(huán)break/return,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java畢業(yè)設(shè)計實戰(zhàn)之生活旅行分享平臺的實現(xiàn)
這是一個使用了java+Springboot+JPA+Jsp+Html+js+Ajax+maven+mysql開發(fā)的生活旅行分享平臺,是一個畢業(yè)設(shè)計的實戰(zhàn)練習,具有分享發(fā)布平臺該有的所有功能,感興趣的朋友快來看看吧2022-02-02
Dubbo在Spring和Spring Boot中的使用詳解
這篇文章主要介紹了Dubbo在Spring和Spring Boot中的使用詳解,需要的朋友可以參考下2017-10-10
Java中關(guān)于size()>0?和isEmpt()的性能考量
這篇文章主要介紹了Java中關(guān)于size()>0?和isEmpt()性能考量,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

