1. 程式人生 > >javacv心得,每隔n幀抓一張圖

javacv心得,每隔n幀抓一張圖

javacv心得,每隔n幀抓一張圖
javacv新手,從網上找的大神寫好的程式碼,但是沒有自己想要的效果,對程式碼進行小修改之後實現了想要的功能。

package com.soft;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacpp.presets.opencv_highgui; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.FrameGrabber.Exception; import org.bytedeco.javacv.Java2DFrameConverter; import org.bytedeco.javacv.OpenCVFrameConverter; /** * javacv * * @author 春曉 * */
// D:\javatest\testvideo D:\javatest\c public class FrameGrabberKit { /* * static int num=0; static String name="test"+num; */ public static void main(String[] args) throws Exception { System.out.println(System.getProperty("java.library.path")); try { fetchFrame("D:/javatest/testvideo/test01.mp4"
); } catch (IOException e) { e.printStackTrace(); } } /** * 獲取指定視訊的幀並儲存為圖片至指定目錄 * * @param videofile * 源視訊檔案路徑 * @param framefile * 擷取幀的圖片存放路徑 * @throws Exception * @throws IOException */ public static void fetchFrame(String videofile) throws Exception, IOException { FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile); ff.start(); ff.getAudioChannels(); String rotate = ff.getVideoMetadata("rotate");// 視訊的旋轉角度 int lenght = ff.getLengthInFrames(); System.out.println("lenght:" + lenght); int i = 0; int j = 1; Frame f = null; while (i < lenght) { // 過濾前5幀,避免出現全黑的圖片,依自己情況而定 //每一千幀生成一張圖片保留,若顯示幀不為關鍵幀,則尋找相鄰的下一幀, //因為是空迴圈,所以把總長度lenght減一 f = ff.grabFrame(); if ((i % 1000) == 0 && i > 5) { while (f.image == null) { f = ff.grabFrame(); lenght = lenght - 1; } if (f.image != null) { IplImage src = null; if (null != rotate && rotate.length() > 1) { OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage(); src = converter.convert(f); f = converter.convert(rotate(src, Integer.valueOf(rotate))); } doExecuteFrame(f, "D:/javatest/testpic/test" + j + ".jpg"); j++; } } i++; } } public static IplImage rotate(IplImage src, int angle) { IplImage img = IplImage.create(src.height(), src.width(), src.depth(), src.nChannels()); opencv_core.cvTranspose(src, img); opencv_core.cvFlip(img, img, angle); return img; } public static void doExecuteFrame(Frame f, String targetFileName) { if (null == f || null == f.image) { return; } Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage bi = converter.getBufferedImage(f); File output = new File(targetFileName); try { ImageIO.write(bi, "jpg", output); } catch (IOException e) { e.printStackTrace(); } } }