<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<classifier>windows-x86_64</classifier>
<version>4.5.3-1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<classifier>linux-x86_64</classifier>
<version>4.5.3-1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<classifier>windows-x86_64</classifier>
<version>0.3.17-1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<classifier>linux-x86_64</classifier>
<version>0.3.17-1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<classifier>windows-x86_64</classifier>
<version>4.4-1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<classifier>linux-x86_64</classifier>
<version>4.4-1.5.6</version>
</dependency>
package com.ps.asset.biz.utils;
import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Base64;
@Slf4j
public class VideoUtil {
/**
* 获取视频时长
* @param videoUrl
* @return
*/
public static long getVideoDuration(String videoUrl) {
try {
URL url = new URL(videoUrl);
URLConnection con = url.openConnection();
con.connect();
InputStream is = con.getInputStream();
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(is);
frameGrabber.start();
long time = frameGrabber.getLengthInTime() / 1000000;
frameGrabber.close();
return time;
} catch (IOException e) {
log.error("获取视频时长报错", e);
return 0;
}
}
/**
* 获取指定视频的帧图片,并转换为base64字符串
* @param videoUrl 源视频文件路径
*/
public static String getFrameImageToBase64FromUrl(String videoUrl) {
InputStream is = null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
URL url = new URL(videoUrl);
URLConnection con = url.openConnection();
con.connect();
is = con.getInputStream();
BufferedImage bufferedImage = getBufferedImage(is);
ImageIO.write(bufferedImage, "jpg", os);
return "data:image/jpg;base64," + Base64.getEncoder().encodeToString(os.toByteArray());
} catch (IOException e) {
log.error("获取视频base64报错", e);
return "";
} finally {
try {
os.close();
if (is != null) {
is.close();
}
} catch (IOException e) {
log.error("关闭流报错", e);
}
}
}
private static BufferedImage getBufferedImage(InputStream is) throws FrameGrabber.Exception {
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(is);
try {
frameGrabber.start();
int length = frameGrabber.getLengthInFrames();
int i = 0;
Frame f = null;
while (i < length) {
// 过滤前300帧,避免出现全黑或为空的图片,依自己情况而定
f = frameGrabber.grabFrame();
if ((i >= 300) && (f.image != null)) {
break;
}
i++;
}
Java2DFrameConverter converter = new Java2DFrameConverter();
return converter.getBufferedImage(f);
} finally {
frameGrabber.close();
}
}
}