依賴
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.9</version>
</dependency>
傳入視頻流獲取圖片byte
/**
* 獲取視頻截圖
*
* @param frameNumber 視頻的指定幀數(shù)
* @param vName 視頻名稱
* @param videoBytes 視頻字節(jié)
* @return 圖片byte數(shù)組
*/
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("截取視頻截圖開(kāi)始 視頻名稱:{} 視頻大小:{}MB", vName, videoSize);
try (ByteArrayInputStream is = new ByteArrayInputStream(videoBytes);
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(is);
ByteArrayOutputStream os = new ByteArrayOutputStream();
Java2DFrameConverter converter = new Java2DFrameConverter()) {
grabber.start();
//視頻的最大幀數(shù),減少10幀是因?yàn)樽詈髱讕瑫?huì)出現(xiàn)獲取不到圖片的情況
int ftp = grabber.getLengthInFrames() - 10;
frameNumber = ftp < frameNumber ? ftp : frameNumber;
//設(shè)置視頻指定幀數(shù)
grabber.setFrameNumber(frameNumber);
//設(shè)置視頻截取幀(默認(rèn)取第一幀)
Frame frame = grabber.grabImage();
//繪制圖片
BufferedImage bi = converter.getBufferedImage(frame);
ImageIO.write(bi, "jpg", os);
grabber.stop();
logger.info("截取視頻截圖結(jié)束,處理時(shí)間: {}秒", (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;
}
傳入視頻流獲取圖片文件
/**
* 傳入視頻文件,生成對(duì)應(yīng)的封面圖文件
*
* @param frameNumber 幀數(shù)
* @param file 視頻文件
*/
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("截取視頻截圖開(kāi)始 視頻名稱:{} 視頻大小:{}MB", vName, videoSize);
try (FileInputStream is = new FileInputStream(file);
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(is);
Java2DFrameConverter converter = new Java2DFrameConverter()) {
grabber.start();
//視頻的最大幀數(shù),減少10幀是因?yàn)樽詈髱讕瑫?huì)出現(xiàn)獲取不到圖片的情況
int ftp = grabber.getLengthInFrames() - 10;
frameNumber = ftp < frameNumber ? ftp : frameNumber;
//設(shè)置視頻指定幀數(shù)
grabber.setFrameNumber(frameNumber);
// 圖片名稱
String targetFileName = vName.substring(0, vName.lastIndexOf(".")) + "_vc.jpg";
logger.info("圖片名稱:{}", targetFileName);
File imageFile = new File("D:\\my_work\\" + targetFileName);
//設(shè)置視頻截取幀(默認(rèn)取第一幀)
Frame frame = grabber.grabImage();
//繪制圖片
BufferedImage bi = converter.getBufferedImage(frame);
ImageIO.write(bi, "jpg", imageFile);
grabber.stop();
logger.info("截取視頻截圖結(jié)束,處理時(shí)間: {}秒", (System.currentTimeMillis() - timeMillis) / 1000);
} catch (FrameGrabber.Exception e) {
logger.error("FrameGrabber.Exception :{}", e.getMessage());
} catch (IOException e) {
logger.error("IOException :{}", e.getMessage());
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-861453.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-861453.html
到了這里,關(guān)于Java獲取視頻封面圖,利用FFmpegFrameGrabber獲取視頻封面圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!