gradle依赖
//ffmpeg
implementation('org.bytedeco:javacv:1.5.8') {
exclude module: 'javacpp'
exclude module: 'flycapture'
exclude module: 'libdc1394'
exclude module: 'libfreenect'
exclude module: 'libfreenect2'
exclude module: 'librealsense'
exclude module: 'librealsense2'
exclude module: 'videoinput'
exclude module: 'opencv'
exclude module: 'tesseract'
exclude module: 'artoolkitplus'
exclude module: 'leptonica'
exclude module: 'openblas'
exclude module: 'flandmark'
}
implementation('org.bytedeco:javacv-platform:1.5.8') {
exclude module: 'javacv'
exclude module: 'flycapture-platform'
exclude module: 'libdc1394-platform'
exclude module: 'libfreenect-platform'
exclude module: 'libfreenect2-platform'
exclude module: 'librealsense-platform'
exclude module: 'librealsense2-platform'
exclude module: 'videoinput-platform'
exclude module: 'opencv-platform'
exclude module: 'tesseract-platform'
exclude module: 'artoolkitplus-platform'
exclude module: 'leptonica-platform'
exclude module: 'openblas-platform'
exclude module: 'flandmark-platform'
}
视频信息类:
import lombok.Data;
import java.io.InputStream;
@Data
public class VideoBean {
/**
* 视频时长 毫秒
*/
private Long duration;
/**
* 视频首帧
*/
private InputStream firstFrameStream;
}
工具类:
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.time.LocalDateTime;
import com.spacex.cid.app.model.VideoBean;
public class FfmpegUtil {
/**
* 获取 视频时长
*
* @param url 网络地址
* @return
*/
public static Long getDuration(String url) {
Long duration = 0L;
if (url == null || url.isEmpty()) {
return duration;
}
try (InputStream inputStream = new URL(url).openStream()) {
try (FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream)) {
fFmpegFrameGrabber.start();
duration = fFmpegFrameGrabber.getLengthInTime() / 1000;
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
System.out.println(LocalDateTime.now() + " --- getDuration --- " + url);
e.printStackTrace();
}
return duration;
}
/**
* 获取 视频时长
*
* @param url 网络地址
* @param retryNum 重试次数
* @return
*/
public static Long getDuration(String url, int retryNum) {
for (int i = 0; i < retryNum; i++) {
try {
Long duration = getDuration(NetUtil.getUrl(url));
if (duration > 0) {
return duration;
}
} catch (Exception e) {
System.out.println("获取时长 - 重定向地址失败 :" + url);
}
}
return 0L;
}
/**
* 获取 视频时长
*
* @param inputStream 本地流
* @return
*/
public static Long getDuration(InputStream inputStream) {
Long duration = 0L;
try (FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream)) {
fFmpegFrameGrabber.start();
duration = fFmpegFrameGrabber.getLengthInTime() / 1000;
} catch (Exception e) {
e.printStackTrace();
}
return duration;
}
/**
* 获取 视频时长 + 首帧
*
* @param inputStream
* @return
*/
public static VideoBean getVideoBean(InputStream inputStream) {
VideoBean videoBean = new VideoBean();
try (FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream)) {
fFmpegFrameGrabber.start();
videoBean.setDuration(fFmpegFrameGrabber.getLengthInTime() / 1000);
int lengthInFrames = fFmpegFrameGrabber.getLengthInFrames();
Frame frame = null;
/** 第一帧,会过滤纯黑 */
for (int i = 0; i < lengthInFrames; i++) {
frame = fFmpegFrameGrabber.grabFrame();
if (frame.image != null) {
break;
}
}
if (frame != null) {
BufferedImage bufferedImage = new Java2DFrameConverter().getBufferedImage(frame);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpeg", byteArrayOutputStream);
videoBean.setFirstFrameStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
}
} catch (Exception e) {
e.printStackTrace();
}
return videoBean;
}
}