JAVA压缩视频,降低码率和分辨率(windows)
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用的插件JAVE
JAVE是基于ffmpeg的封装插件
二、使用步骤
1.引入依赖
<!--压缩视频-->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-win64</artifactId>
<version>3.0.0</version>
</dependency>
2.检查
如果是发布服务器(检查一下ffmpeg.exe文件是否在指定文件夹中,如果没有,从未发布前的本地maven库中找到jave-nativebin-win64里面找到,如下图,将jar文件解压打开)
发布在服务器端,控制台如果报未找到或未运行ffmpeg.exe的错误,根据报错的路径打开查看是否存在ffmpeg.exe,我默认的会在如图tomcat下的位置:
2.上代码
注意:本段代码只是工具类的一个静态方法,该段代码具体百度有很多,稍微整理了一下,原作者看到可以联系我我标明,我看到的也不是原作者写的,其中在里面加了audio/video的判断,分辨率宽度的奇偶,因为使用过程中,发现被处理过的视频分辨率会出现1280 X 523的情况,该插件就会在日志里面看到 XXX cannot be divisible by 2
/**
* 传视频File对象,返回压缩后File对象信息
* @param
*/
public static File compressionVideo(String filePath,String picName) {
//获取文件对象
File source = new File(filePath);
if(source == null){
return null;
}
//创建目标对象
String newPath = source.getAbsolutePath().substring(0, source.getAbsolutePath().lastIndexOf(File.separator)).concat(File.separator).concat("a" + picName);
File target = new File(newPath);
try {
//根据路径获取媒体对象(视频/音频)
MultimediaObject object = new MultimediaObject(source);
//TODO 标准属性配置
int maxBitRate = 128000;
int maxSamplingRate = 44100;
int bitRate = 800000;
int maxFrameRate = 20;
int maxWidth = 1280;
//实例化音频/视频对象
AudioAttributes audio = new AudioAttributes();
VideoAttributes video = new VideoAttributes();
/**
* 音频属性(类似于MP3文件压缩)
* TODO 注意判断视频/音频是否为null来选择Video还是Audio
*/
if(object.getInfo().getAudio() != null){
//创建音频对象
AudioInfo audioInfo = object.getInfo().getAudio();
if(audioInfo.getBitRate() > maxBitRate){
audio.setBitRate(new Integer(maxBitRate));//比特率越高,清晰度/音质越好,文件越大
}
audio.setChannels(audioInfo.getChannels());//(1 =单声道,2 = 双声道(立体声))。如果未设置任何声道值,则编码器将选择默认值 0
//audio.setVolume(256);//默认为0,如果256,则音量值不会改变
if(audioInfo.getSamplingRate() > maxSamplingRate){
audio.setSamplingRate(maxSamplingRate);//采样率越高声音的还原度越好,文件越大,单位:赫兹 hz
}
}
/**
* 视频属性(类似于MP4文件压缩)
* TODO 注意判断视频/音频是否为null来选择Video还是Audio
*/
if(object.getInfo().getVideo() != null){
ws.schild.jave.info.VideoInfo videoInfo = object.getInfo().getVideo();
video.setCodec("h264");
if(videoInfo.getBitRate() > bitRate){
video.setBitRate(bitRate); //设置视频比特率,单位:b (比特率越高,清晰度/音质越好,文件也就越大)
}
if(videoInfo.getFrameRate() > maxFrameRate){
video.setFrameRate(maxFrameRate);//设置视频帧率(帧率越低,效果越差,FPS)或“赫兹”(Hz)。
}
// 限制视频宽高
int width = videoInfo.getSize().getWidth();
int height = videoInfo.getSize().getHeight();
int hr = 0;
if(width > maxWidth){
float rat = (float) width / maxWidth;
hr = (int)(height/rat);
if (hr % 2 != 0) {
hr = hr - 1;
}
video.setSize(new VideoSize(maxWidth,hr));
}
}
//将设置好的视频/音频对象填充到压缩对象
EncodingAttributes attr = new EncodingAttributes();
attr.setAudioAttributes(audio);
attr.setVideoAttributes(video);
//创建压缩对象
Encoder encoder = new Encoder();
//开始压缩
encoder.encode(new MultimediaObject(source), target, attr);
return target;
} catch (Exception e) {
e.printStackTrace();
}finally {
if(target.length() > 0){
source.delete();
}
}
return source;
}
2.调用
根据自己的实际业务情况,路径,文件名传入即可
总结
插件简单,插件中很多配置参数一定要知道他的作用,好像该插件可以加速压缩,但是我查阅他的官方文档好像没有—jave官网。
感兴趣的可以多搜集一下资料研究一下加速压缩,或者有经验的老哥不吝赐教,最后说一下他的压缩效率。实测80m压缩9m左右,时间69s;40多m压缩完760k,时间20s左右。对于服务器内存吃紧的可以考虑使用,以时间换空间,最最最后说一句,报错第一时间看日志,看日志,这个插件会将相应的所有错误打印出来,记得翻译翻译。