JavaCV實(shí)現(xiàn)獲取視頻每幀并保存
興趣使然寫的代碼,因?yàn)闆]有接觸過JavaCV,所以查了很久的API還有依賴包,也使用了openCV來寫過,但是還是遇到很多問題。希望小伙伴指出不足,互相學(xué)習(xí)。
環(huán)境配置:
JavaCV1.4.1(下載Jar包,解壓并提取所需要的Jar。這點(diǎn)耗時(shí)比較長(zhǎng),萌新完全不知道需要用什么,看源碼及例子推出)
Java版本:Java10
具體代碼:
package VideoProcessing; 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.File; import java.io.IOException; /** * TODO:處理視頻.(1.將視頻提取成幀圖片) * * @author ChenP */ public class VideoProcessing { //視頻文件路徑 private static String videoPath = "D:/IdeaTool/video"; //視頻幀圖片存儲(chǔ)路徑 public static String videoFramesPath = "D:/IdeaTool/img"; /** * TODO 將視頻文件幀處理并以“jpg”格式進(jìn)行存儲(chǔ)。 * 依賴FrameToBufferedImage方法:將frame轉(zhuǎn)換為bufferedImage對(duì)象 * * @param videoFileName */ public static void grabberVideoFramer(String videoFileName) { //Frame對(duì)象 Frame frame = null; //標(biāo)識(shí) int flag = 0; /* 獲取視頻文件 */ FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName); try { fFmpegFrameGrabber.start(); /* .getFrameRate()方法:獲取視頻文件信息,總幀數(shù) */ int ftp = fFmpegFrameGrabber.getLengthInFrames(); // System.out.println(fFmpegFrameGrabber.grabKeyFrame()); System.out.println("時(shí)長(zhǎng) " + ftp / fFmpegFrameGrabber.getFrameRate() / 60); BufferedImage bImage = null; System.out.println("開始運(yùn)行視頻提取幀,耗時(shí)較長(zhǎng)"); while (flag <= ftp) { //文件絕對(duì)路徑+名字 String fileName = videoFramesPath + "/img_" + String.valueOf(flag) + ".jpg"; //文件儲(chǔ)存對(duì)象 File outPut = new File(fileName); //獲取幀 frame = fFmpegFrameGrabber.grabImage(); // System.out.println(frame); if (frame != null) { ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut); } flag++; } System.out.println("============運(yùn)行結(jié)束============"); fFmpegFrameGrabber.stop(); } catch (IOException E) { } } public static BufferedImage FrameToBufferedImage(Frame frame) { //創(chuàng)建BufferedImage對(duì)象 Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage bufferedImage = converter.getBufferedImage(frame); return bufferedImage; } /* 測(cè)試..... */ public static void main(String[] args) { String videoFileName = "1.mp4"; grabberVideoFramer(videoFileName); } public static String getVideoPath() { return videoPath; } public static void setVideoPath(String videoPath) { VideoProcessing.videoPath = videoPath; } }
這個(gè)代碼耗時(shí)比較長(zhǎng),和軟件比起來感覺是稍微長(zhǎng)些,不知道有沒有其他BUG。
效果圖:
各位技術(shù)大拿,有什么指點(diǎn),歡迎提出。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC中@RequestMapping注解的實(shí)現(xiàn)
RequestMapping是一個(gè)用來處理請(qǐng)求地址映射的注解,本文主要介紹了SpringMVC中@RequestMapping注解的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01SpringMVC中@ModelAttribute注解的使用教程
在SpringMVC中,我們可以通過使用@ModelAttribute注解標(biāo)記方法,實(shí)現(xiàn)類似于Struts2中Preparable攔截器的效果,這篇文章主要給大家介紹了關(guān)于SpringMVC中@ModelAttribute注解使用的相關(guān)資料,需要的朋友可以參考下2021-08-08Java集合操作之List接口及其實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java集合操作之List接口及其實(shí)現(xiàn)方法,詳細(xì)分析了Java集合操作中List接口原理、功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2015-07-07Java實(shí)現(xiàn)PDF轉(zhuǎn)圖片的三種方法
有些時(shí)候我們需要在項(xiàng)目中展示PDF,所以我們可以將PDF轉(zhuǎn)為圖片,然后已圖片的方式展示,效果很好,Java使用各種技術(shù)將pdf轉(zhuǎn)換成圖片格式,并且內(nèi)容不失幀,本文給大家介紹了三種方法實(shí)現(xiàn)PDF轉(zhuǎn)圖片的案例,需要的朋友可以參考下2023-10-10Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot定時(shí)任務(wù)多線程實(shí)現(xiàn)示例
在真實(shí)的Java開發(fā)環(huán)境中,我們經(jīng)常會(huì)需要用到定時(shí)任務(wù)來幫助我們完成一些特殊的任務(wù),本文主要介紹了SpringBoot定時(shí)任務(wù)多線程實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12