当前访客身份:游客 [ 登录 | 加入开源中国 ]

代码分享

当前位置:
代码分享 » Java  » 常用工具方法
分享到: 
收藏 +0
0
<无详细内容>
标签: JavaCV FFmpeg

代码片段(1) [全屏查看所有代码]

1. [代码]随机获取视频某些帧,生成图片     跳至 [1] [全屏预览]

package com.egova.ffmpeg.java;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.imageio.ImageIO;

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber.Exception;
import org.bytedeco.javacv.Java2DFrameConverter;

public abstract class FrameGrabberKit {

    public static void main(String[] args) throws Exception {
		randomGrabberFFmpegImage("F:/CodeSpace/java/ffmpeg_java/resource/月赋情长.mp4", "./target", "月赋情长", 10);
	}

	
	public static void randomGrabberFFmpegImage(String filePath, String targerFilePath, String targetFileName, int randomSize)
			throws Exception {
		FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
		ff.start();
		int ffLength = ff.getLengthInFrames();
		List<Integer> randomGrab = random(ffLength, randomSize);
		int maxRandomGrab = randomGrab.get(randomGrab.size() - 1);
		Frame f;
		int i = 0;
		while (i < ffLength) {
			f = ff.grabImage();
			if (randomGrab.contains(i)) {
				doExecuteFrame(f, targerFilePath, targetFileName, i);
			}
			if (i >= maxRandomGrab) {
				break;
			}
			i++;
		}
		ff.stop();
	}

	public static void doExecuteFrame(Frame f, String targerFilePath, String targetFileName, int index) {
		if (null == f || null == f.image) {
			return;
		}
		
		Java2DFrameConverter converter = new Java2DFrameConverter();

		String imageMat = "jpg";
		String FileName = targerFilePath + File.separator + targetFileName + "_" + index + "." + imageMat;
		BufferedImage bi = converter.getBufferedImage(f);
		File output = new File(FileName);
		try {
			ImageIO.write(bi, imageMat, output);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static List<Integer> random(int baseNum, int length) {

		List<Integer> list = new ArrayList<>(length);
		while (list.size() < length) {
			Integer next = (int) (Math.random() * baseNum);
			if (list.contains(next)) {
				continue;
			}
			list.add(next);
		}
		Collections.sort(list);
		return list;
	}
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(5)

  • 1楼:OutMan1234 发表于 2016-12-29 21:16 回复此评论
    666
  • 2楼:OutMan1234 发表于 2016-12-29 21:17 回复此评论
    666
  • 3楼:DonaldD 发表于 2017-07-19 10:38 回复此评论
    这是那个版本的javacv,找不到Java2DFrameConverter
  • 4楼:DonaldD 发表于 2017-07-19 10:46 回复此评论
    javacv-1.1 https://mvnrepository.com/artifact/org.bytedeco/javacv/1.1
  • 5楼:索倍科技 发表于 2018-07-05 09:15 回复此评论

    引用来自“DonaldD”的评论

    这是那个版本的javacv,找不到Java2DFrameConverter
    1.3
开源从代码分享开始 分享代码
妹子楼顶有鸽子的其它代码 全部(1)...