通过javacv对视频每隔1秒钟截取1张图片

 

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutil
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
at org.bytedeco.javacpp.Loader.load(Loader.java:385)
at org.bytedeco.javacpp.Loader.load(Loader.java:353)
at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2249)
at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:346)
at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:340)

 

http://stackoverflow.com/questions/27733142/could-not-initialize-class-org-bytedeco-javacpp-avutil-on-os-x-along-with-maven

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.0</version>
</dependency>

 

FFmpegFrameGrabber g = new FFmpegFrameGrabber("textures/video/anim.mp4");
g.start();

for (int i = 0 ; i < 50 ; i++) {
    ImageIO.write(g.grab().getBufferedImage(), "png", new File("frame-dump/video-frame-" + System.currentTimeMillis() + ".png"));
}

g.stop();

http://stackoverflow.com/questions/15735716/how-can-i-get-a-frame-sample-jpeg-from-a-video-mov

https://github.com/bytedeco/javacv/

JavaCV 随机获取视频中的某些帧的图片

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;
    }
}

 

 

 

之前每一秒钟截取一张图片,发现有些图片报了“[mpeg4 @ 05938aa0] warning: first frame is no keyframe”这个警告,而且截出的图片都是灰屏,根本没有图片。后来在网上找了很久,终于弄明白了,原来是ffmpeg它有“关键帧”这个说法,所以如果设置的帧的位置不是关键帧的位置的话,就可能截出的图片有问题。后来经过改进,终于搞定了。

 

	public static void main(String[] args) {
		System.out.println(System.getProperty("java.library.path"));
//		 System.out.println("Welcome to OpenCV " + Core.VERSION);
//		 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//		 Mat m = Mat.eye(3, 3, CvType.CV_8UC1);
//		 System.out.println("m = " + m.dump());

		// 加载本地的OpenCV库,这样就可以用它来调用Java API
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		Test t = new Test();
//		t.test();
//		t.run();
//		t.run2();
		t.run3();
//		System.out.println(t.CmpPic("d:/img/219.jpg"));
	}

 

	public void run3() {
		CvCapture capture = opencv_highgui.cvCreateFileCapture("D:/085402.crf");

		//帧率
		int fps = (int) opencv_highgui.cvGetCaptureProperty(capture, opencv_highgui.CV_CAP_PROP_FPS);
		System.out.println("帧率:"+fps);

		IplImage frame = null;
		double pos1 = 0;

		int rootCount = 0;

		while (true) {

			//读取关键帧
			frame = opencv_highgui.cvQueryFrame(capture);

			rootCount = fps;
			while(rootCount > 0 ){
				//这一段的目的是跳过每一秒钟的帧数,也就是说fps是帧率(一秒钟有多少帧),在读取一帧后,跳过fps数量的帧就相当于跳过了1秒钟。
				frame = opencv_highgui.cvQueryFrame(capture);
				rootCount--;
			}

			//获取当前帧的位置
			pos1 = opencv_highgui.cvGetCaptureProperty(capture,opencv_highgui.CV_CAP_PROP_POS_FRAMES);
			System.out.println(pos1);

			if (null == frame)
				break;

			opencv_highgui.cvSaveImage("d:/img/" + pos1 + ".jpg",frame);

		}

		opencv_highgui.cvReleaseCapture(capture);
	}

 

http://www.voidcn.com/blog/kouwoo/article/p-4830734.html

http://stackoverflow.com/questions/33319899/java-lang-unsatisfiedlinkerror-no-opencv-java300-in-java-library-path-only-whil 

http://git.oschina.net/leixiaohua1020/simplest_video_website

https://ffmpeg.zeranoe.com/builds/ 

 

时间: 2024-09-28 04:01:18

通过javacv对视频每隔1秒钟截取1张图片的相关文章

紧急求教,我想在每隔5秒钟让代码运行一次,要怎么实现

问题描述 我想在每隔5秒钟让代码运行一次,要怎么实现? 解决方案 解决方案二:可以用JS定时刷新..或者用time控件来实现解决方案三:jssetInterVal(aa,5000);解决方案四:用JS中的settimeout()实现是.解决方案五:有用CS实现的方法么解决方案六:要的是具体怎么实现解决方案七:就是在for循环时叫他循环一条停一段时间解决方案八:用时间控件ajax里面那个Timer解决方案九:js:setInterVal()或者settimeout()Timer解决方案十:js:用

HTML5播放m3u8视频每隔一段时间就自动停止,点击可继续播放的问题。

问题描述 HTML5播放m3u8视频每隔一段时间就自动停止,点击可继续播放的问题. HTML5播放m3u8视频每隔一段时间就自动停止,点击可继续播放. 但是,直接在浏览器中播放同样的m3u8视频不会出现这样的问题,请问有人知道这是什么原因吗? 谢谢

c++实现每隔1秒钟执行一段程序

 #include <iostream> #include <ctime> using namespace std; int getTime() { return clock()/CLOCKS_PER_SEC; } int main() { int i = 0; int lastTime = 0; while (1) { int now = getTime(); if (now - lastTime > 0) { cout << ++i << endl

Twitter如何做到每秒钟处理3000张图片上传

今天的Twitter每秒钟能够创建并保存3000张(200GB)图片.甚至早在2015年,Twitter就通过改进媒体存储策略节约了6百万美元. 以前并不是这样的.Twitter在2012年主要以提供文字信息为主,当时的用户也很少发布各种炫酷的动态图片.到现在2016年,Twitter开始提供富媒体功能.这样的转变是通过Twitter自行开发的全新媒体平台(Media Platform)实现的,这个平台可以支持照片预览.多张照片发送.动态Gif图片.Vine视频,以及内嵌视频等功能. Twitt

视频网站-如何用JavaScript截取视频地址,如爱奇艺,优酷等

问题描述 如何用JavaScript截取视频地址,如爱奇艺,优酷等 使用js脚本,获取视频网站中视频的真实地址URL,并返回这个URL 解决方案 优酷真实视频地址解析优酷真实视频地址解析 解决方案二: 抓包撒 很多抓包工具 连接自己WiFi就可以在电脑上获取 解决方案三: 抓包撒 很多抓包工具 连接自己WiFi就可以在电脑上获取

Android实现图片文字轮播特效_Android

本文实例讲解了Android实现图片文字轮播特效的详细代码,分享给大家供大家参考,具体内容如下 图片轮播是类似知乎日报上的一个轮播效果,如下图. 好了直接进入正题,首先是出示一下效果: MainActivity: import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService;

YY李学凌:未来致力“富集通讯”做视频是必然

(i美股讯)北京时间12月3日消息,日前欢聚时代(YY)举行了上市答谢暨战略分享大会,以下是记者对欢聚时代CEO李学凌的问答环节.主要观点包括:把业绩做好是获得美国投资者信任的唯一途径:创业不要求速成,团队最重要:业务专注移动互联网,自己带项目:不倒用户,不做内容做平台:YY音乐和YY教育均免费提供平台服务:核心竞争力包括技术投入大,且已形成用户社区:未来真正要做的是"富集通信",做视频是必然:海外战略YY已经有巴西版,有可能成为跨国产品.问答实录如下:一 谈上市:把业绩做好是获得美国

页面间隔半秒钟更新时间 Asp.net使用Comet开发http长连接示例分享_实用技巧

好处:1.和AJAX轮询比起来 节省资源,并且延迟小, 2.和webSocket比起来,适用的场景比较广泛. 1.先建立一个Asp.net MVC的空项目 添加一个控制器  (同样的代码在Asp.net WebForm中也是可以使用的) 复制代码 代码如下: public class CometController : Controller    {        public ActionResult Test()        {            Response.Buffer = f

美国法庭Skype隔空审案助骨肉团聚

墨西哥夫妇阿方索·梅西亚和玛格丽塔·阿尔马拉斯借助网络电话和视频工具Skype接受美国宾夕法尼亚州一家法庭审理,夺回两个女儿的抚养权.时隔两年半,这对夫妇与一对女儿18日团聚. 法庭应用网络视频远距离"隔空"审理案件,在美国首开先河. 夫妇俩的律师解释说,就以往案例看,租用专业视频装备每小时花费300至500美元,对梅西亚夫妇而言是"天价".另外,他们先前遭遣返,几乎不可能为在美国法庭出庭获得签证.所以,"远程"打官司是唯一选择. 这一技术应用案