引入依赖
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>${ws.schild}</version>
</dependency>
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-linux64</artifactId>
<version>${ws.schild}</version>
</dependency>
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-win64</artifactId>
<version>${ws.schild}</version>
</dependency>
java示例
package com.zzx.utils;
import cn.hutool.core.io.FileUtil;
import org.apache.commons.io.FileUtils;
import org.jcodec.api.FrameGrab;
import org.jcodec.common.model.Picture;
import org.jcodec.scale.AWTUtil;
import org.springframework.web.multipart.MultipartFile;
import ws.schild.jave.Encoder;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.encode.VideoAttributes;
import ws.schild.jave.info.AudioInfo;
import ws.schild.jave.info.VideoInfo;
import ws.schild.jave.info.VideoSize;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;
import java.net.URL;
public class VideoUtils {
public static String[] videoEnum = new String[] { "AVI", "mov", "rmvb", "rm", "FLV", "mp4", "3GP" };
public static InputStream compressionVideo(MultipartFile source) {
if (source == null) {
return null;
}
String suffix = FileUtil.extName(source.getOriginalFilename());
String targetPath = System.getProperty("user.dir") + System.getProperty("file.separator") + "target." + suffix;
File target = new File(targetPath);
String tmpPath = System.getProperty("user.dir") + System.getProperty("file.separator") + "tmp." + suffix;
File tmpSource = new File(tmpPath);
try {
FileUtils.copyInputStreamToFile(source.getInputStream(), tmpSource);
MultimediaObject object = new MultimediaObject(tmpSource);
AudioInfo audioInfo = object.getInfo().getAudio();
int maxSize = 5;
long size = source.getSize();
double mb = Math.ceil(size / 1048576);
int second = (int) object.getInfo().getDuration() / 1000;
BigDecimal bd = new BigDecimal(String.format("%.4f", mb / second));
System.out.println("开始压缩视频了--> 视频每秒平均 " + bd + " MB ");
boolean temp = mb > maxSize || bd.compareTo(new BigDecimal(0.5)) > 0;
if (temp) {
long time = System.currentTimeMillis();
int maxBitRate = 128000;
int maxSamplingRate = 44100;
int bitRate = 800000;
int maxFrameRate = 20;
int maxWidth = 1280;
AudioAttributes audio = new AudioAttributes();
audio.setCodec("aac");
if (audioInfo.getBitRate() > maxBitRate) {
audio.setBitRate(Integer.valueOf(maxBitRate));
}
audio.setChannels(audioInfo.getChannels());
if (audioInfo.getSamplingRate() > maxSamplingRate) {
audio.setSamplingRate(maxSamplingRate);
}
VideoInfo videoInfo = object.getInfo().getVideo();
VideoAttributes video = new VideoAttributes();
video.setCodec("h264");
if ("avi".equals(suffix)) {
video.setCodec("mpeg4");
}
if (videoInfo.getBitRate() > bitRate) {
video.setBitRate(bitRate);
}
if (videoInfo.getFrameRate() > maxFrameRate) {
video.setFrameRate(maxFrameRate);
}
int width = videoInfo.getSize().getWidth();
int height = videoInfo.getSize().getHeight();
if (width > maxWidth) {
float rat = (float) width / maxWidth;
video.setSize(new VideoSize(maxWidth, (int) (height / rat)));
}
EncodingAttributes attr = new EncodingAttributes();
attr.setOutputFormat(suffix);
attr.setAudioAttributes(audio);
attr.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(new MultimediaObject(tmpSource), target, attr);
System.out.println("压缩总耗时:" + (System.currentTimeMillis() - time));
FileInputStream inputStream = new FileInputStream(target);
return inputStream;
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (target != null && target.length() > 0) {
target.delete();
}
if (tmpSource != null && tmpSource.length() > 0) {
tmpSource.delete();
}
try {
return source.getInputStream();
}
catch (IOException e) {
return null;
}
}
}
private static final String FILE_EXT = "jpg";
private static final int THUMB_FRAME = 5;
public static void getThumbnail(File targetFile, String videoUrl) {
try {
File file = saveFile(videoUrl);
Picture picture = FrameGrab.getFrameFromFile(file, THUMB_FRAME);
BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
ImageIO.write(bufferedImage, FILE_EXT, targetFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public static File saveFile(String urlString) {
try {
URL url = new URL(urlString);
InputStream inputStream = url.openStream();
String tmpPath = System.getProperty("user.dir") + System.getProperty("file.separator") + "tmp.jpg";
File file = new File(tmpPath);
OutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
inputStream.close();
return file;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}