java爬虫并保存到txt_Java爬虫:下载视频并压缩保存

本文介绍了如何在Windows环境下,通过自定义ffmpeg命令实现视频压缩,并着重提到如何根据视频原始尺寸动态调整压缩参数,以避免因比例失真。作者分享了如何获取视频宽高、设置固定尺寸以及解决视频失真的解决方案,同时提到了所需的Java库和打包配置调整。
摘要由CSDN通过智能技术生成

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);

}

}

运行效果:

91cbaf46bdc81aa8b0b97016f50ef3ba.png

总结:注意以下代码 是打印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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值