1.windows环境下
2.使用ffmpeg
第一步:下载ffmpeg 解压到服务器本地(自己百度下载地址)
第二步:配置执行文件到环境变量(配置java环境变量差不多)
第三步:在java环境调用执行文件对视频文件进行压缩保存。
代码:
压缩方法:
public static voidffmpegChange(File file, File fileSave){long startTime =System.currentTimeMillis();try{
logger.info("=========文件"+ file + "正在压缩中");
Runtime runtime=Runtime.getRuntime();
String cutCmd= "ffmpeg -i" + file + "-r 15 -b:v 750k -s 1280*720" +fileSave;
Process proce=runtime.exec(cutCmd);
InputStream erro=proce.getErrorStream();byte[] a = new byte[1024];int j = 0;while((j=erro.read(a))>-1){//logger.info(new String(a));
}
}catch(Exception e) {
e.printStackTrace();
logger.info("=========文件"+ file + "正在转换出现异常");
}
logger.info("=========文件"+ file + "压缩完成");long endTime =System.currentTimeMillis();
logger.info("压缩完成时间" + (endTime - startTime) + "ms");
}
使用该方法:
@Overridepublic voiddownloadVideo() {
List learnVideos = this.list((new QueryWrapper())
.eq("fix_status","0")//.eq("autoid",787)
);for(LearnVideo learnVideo : learnVideos) {//文件存放目录
String filePath = path + relativePath + learnVideo.getWebGuid() + "\\";
String fileRelativePath= relativePath + learnVideo.getWebGuid() + "\\";
String sourceThumbnail=learnVideo.getLearnVideoSourceThumbnail();
String sourceUrl2=learnVideo.getSourceUrl2();
String sourceUrl3=learnVideo.getSourceUrl3();
String otherUrl= StringUtils.isNotEmpty(sourceUrl2) ?sourceUrl2 : sourceUrl3;if(StringUtils.isNotEmpty(otherUrl)) {
learnVideo.setLearnVideoSoureUrl(otherUrl);
}
String learnVideoSoureUrl=learnVideo.getLearnVideoSoureUrl();//下载缩略图 并保存本地相对路径
if(StringUtils.isNotEmpty(sourceThumbnail)) {
handleNormalThumb(filePath, fileRelativePath, learnVideo, sourceThumbnail);
}//下载媒体文件 并保存相对路径
if(StringUtils.isNotEmpty(learnVideoSoureUrl)) {
String[] split= learnVideoSoureUrl.split("/");
String name= split[split.length - 1];
name= String.valueOf(RandomUtil.randomInt(1, 99)) +name;
sleepHandle(learnVideo);if (learnVideoSoureUrl.contains("oss")) {
String referer=learnVideo.getLearnVideoWebSourceUrl();
DownloadPictureTest.downloadPictureWithOSS(learnVideoSoureUrl, filePath+ "temp\\", name, referer);
}else{
DownloadPictureTest.downloadPictureSSL(learnVideoSoureUrl, filePath+ "temp\\", name);
}
learnVideo.setLearnVideoPlayUrl(fileRelativePath+name);//另外起线程压缩视频
File file = new File(filePath + "temp\\" +name);
File file2= new File(filePath +name);
MyUtil.ffmpegChange(file, file2);//转换完成后删除temp文件
file.delete();
}
learnVideo.setFixStatus("1");this.updateById(learnVideo);
}
}
运行效果:
总结:注意以下代码 是打印cmd窗口信息 如果不做这个操作 会导致没有压缩完 就中断 导致压缩失败
while((j=erro.read(a))>-1){//logger.info(new String(a));
}
还有就是搞个临时文件夹设置 被压缩文件 和压缩完成文件 同名会导致失败
补充:
使用上述办法实现了视频的压缩 而且为视频设置固定高宽,但是当视屏高宽比例与 1280*720相差甚远的时候 会造成视屏严重失真 现在就来解决这个问题
1.网上去下载jave包 并放在resource/lib下面
pom添加
java
jave
1.0.2.
system
${project.basedir}/src/main/resources/lib/jave-1.0.2.jar
还有 很重要的一点 打包配置修改如下 不然会造成打包到线上缺少jar包
org.springframework.boot
spring-boot-maven-plugin
true
接下来上逻辑代码 获取视屏高宽 再进行压缩处理 我这里只是简单跳过了竖向的视屏
public staticLong ffmpegChange(File file, File fileSave){long startTime =System.currentTimeMillis();//获取视频宽高
File source =file;
Encoder encoder= newEncoder();int width = 1280;int height = 720;try{
MultimediaInfo m=encoder.getInfo(source);long ls =m.getDuration();
logger.info("此视频时长为:" + ls / 60000 + "分" + (ls) / 1000 + "秒!");//视频帧宽高
int height1 =m.getVideo().getSize().getHeight();
logger.info("此视频高度为:" +height1);int width1 =m.getVideo().getSize().getWidth();
logger.info("此视频宽度为:" +width1);
logger.info("此视频格式为:" +m.getFormat());if (height1 >width1) {
width=width1;
height=height1;
}
}catch(Exception e) {
e.printStackTrace();
}try{
logger.info("=========文件"+ file + "正在压缩中");
Runtime runtime=Runtime.getRuntime();
String cutCmd= "ffmpeg -i" + file + "-r 15 -b:v 750k -s"+width+"*"+height+" " +fileSave;
Process proce=runtime.exec(cutCmd);
InputStream erro=proce.getErrorStream();byte[] a = new byte[1024];int j = 0;while ((j = erro.read(a)) > -1) {//logger.info(new String(a));
}
}catch(Exception e) {
e.printStackTrace();
logger.info("=========文件"+ file + "正在转换出现异常");
}
logger.info("=========文件"+ file + "压缩完成");long endTime =System.currentTimeMillis();
logger.info("压缩完成时间" + (endTime - startTime) + "ms");return endTime -startTime;
}