依赖
< dependency>
< groupId> org.bytedeco</ groupId>
< artifactId> javacv-platform</ artifactId>
< version> 1.5.9</ version>
</ dependency>
传入视频流获取图片byte
private byte [ ] getCoverImageBytes ( Integer frameNumber, String vName, byte [ ] videoBytes) {
Double videoSize = DoubleUtil . getDouble2 ( videoBytes. length / 1024.0 / 1024.0 ) ;
long timeMillis = System . currentTimeMillis ( ) ;
logger. info ( "截取视频截图开始 视频名称:{} 视频大小:{}MB" , vName, videoSize) ;
try ( ByteArrayInputStream is = new ByteArrayInputStream ( videoBytes) ;
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber ( is) ;
ByteArrayOutputStream os = new ByteArrayOutputStream ( ) ;
Java2DFrameConverter converter = new Java2DFrameConverter ( ) ) {
grabber. start ( ) ;
int ftp = grabber. getLengthInFrames ( ) - 10 ;
frameNumber = ftp < frameNumber ? ftp : frameNumber;
grabber. setFrameNumber ( frameNumber) ;
Frame frame = grabber. grabImage ( ) ;
BufferedImage bi = converter. getBufferedImage ( frame) ;
ImageIO . write ( bi, "jpg" , os) ;
grabber. stop ( ) ;
logger. info ( "截取视频截图结束,处理时间: {}秒" , ( System . currentTimeMillis ( ) - timeMillis) / 1000 ) ;
return os. toByteArray ( ) ;
} catch ( FrameGrabber. Exception e) {
logger. error ( "FrameGrabber.Exception :{}" , e. getMessage ( ) ) ;
} catch ( IOException e) {
logger. error ( "IOException :{}" , e. getMessage ( ) ) ;
}
logger. info ( "获取视频封面图失败 vName:{}" , vName) ;
return null ;
}
传入视频流获取图片文件
private void coverImage ( Integer frameNumber, File file) {
String vName = file. getName ( ) ;
Double videoSize = DoubleUtil . getDouble2 ( file. length ( ) / 1024.0 / 1024.0 ) ;
long timeMillis = System . currentTimeMillis ( ) ;
logger. info ( "截取视频截图开始 视频名称:{} 视频大小:{}MB" , vName, videoSize) ;
try ( FileInputStream is = new FileInputStream ( file) ;
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber ( is) ;
Java2DFrameConverter converter = new Java2DFrameConverter ( ) ) {
grabber. start ( ) ;
int ftp = grabber. getLengthInFrames ( ) - 10 ;
frameNumber = ftp < frameNumber ? ftp : frameNumber;
grabber. setFrameNumber ( frameNumber) ;
String targetFileName = vName. substring ( 0 , vName. lastIndexOf ( "." ) ) + "_vc.jpg" ;
logger. info ( "图片名称:{}" , targetFileName) ;
File imageFile = new File ( "D:\\my_work\\" + targetFileName) ;
Frame frame = grabber. grabImage ( ) ;
BufferedImage bi = converter. getBufferedImage ( frame) ;
ImageIO . write ( bi, "jpg" , imageFile) ;
grabber. stop ( ) ;
logger. info ( "截取视频截图结束,处理时间: {}秒" , ( System . currentTimeMillis ( ) - timeMillis) / 1000 ) ;
} catch ( FrameGrabber. Exception e) {
logger. error ( "FrameGrabber.Exception :{}" , e. getMessage ( ) ) ;
} catch ( IOException e) {
logger. error ( "IOException :{}" , e. getMessage ( ) ) ;
}