1. 程式人生 > >ffmpeg解析視訊的每一幀(java )

ffmpeg解析視訊的每一幀(java )

前置條件:下載opencv的jar包匯入。ffmpeg

1.需要的jar包如下:


2.還有一個步驟:你下載的opencv中有兩個dll檔案。

ffmpeg預設可以載入avi格式的視訊,

如果想要載入MP4格式的視訊的話,需要在local.library.path路徑下放置ffmpeg.dll檔案。

(如果是avi格式的視訊,不需要此步驟,直接跳到3)


本地工程的native  labrary要配置能找到他們:


這樣就可以了。

3.

package test;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

import com.googlecode.javacv.cpp.opencv_highgui;

public class DecodeVideo {
	
	public static void main(String[] args) {
		System.loadLibrary("opencv_ffmpeg330_64");
		// 載入本地的OpenCV庫,這樣就可以用它來呼叫Java API
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		run2();
	}

	public static void run2() {
		// 讀取視訊檔案
		VideoCapture cap = new VideoCapture("F:/mysour/csdn/2.mp4");
		System.out.println(cap.isOpened());
		// 判斷視訊是否開啟
		if (cap.isOpened()) {
			// 總幀數
			double frameCount = cap.get(opencv_highgui.CV_CAP_PROP_FRAME_COUNT);
			System.out.println("視訊總幀數:" + frameCount);
			// 幀率
			double fps = cap.get(opencv_highgui.CV_CAP_PROP_FPS);
			System.out.println("視訊幀率" + fps);
			// 時間長度
			double len = frameCount / fps;
			System.out.println("視訊總時長:" + len);
			Double d_s = new Double(len);
			System.out.println(d_s.intValue());
			Mat frame = new Mat();
			for (int i = 0; i < d_s.intValue(); i++) {
				// 設定視訊的位置(單位:毫秒)
				cap.set(opencv_highgui.CV_CAP_PROP_POS_MSEC, i * 1000);
				// 讀取下一幀畫面
				if (cap.read(frame)) {
					System.out.println("正在儲存");
					// 儲存畫面到本地目錄
					Imgcodecs.imwrite("F:/mysour/video/output/" + i + ".jpg", frame);					
				}
			}
			// 關閉視訊檔案
			cap.release();
		}
	}
}


本段java實現擷取視訊,每一秒擷取一幀作為jpg圖片儲存在本地。

效果如下:


接下來,我在研究能不能把解析的圖片再合成一個視訊來播放。

如果有實現的大神請不吝賜教,小弟一定虛心學習。

網上找了資料,實現了圖片轉視訊:

package test;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

import org.jim2mov.core.DefaultMovieInfoProvider;
import org.jim2mov.core.ImageProvider;
import org.jim2mov.core.Jim2Mov;
import org.jim2mov.core.MovieInfoProvider;
import org.jim2mov.core.MovieSaveException;
import org.jim2mov.utils.MovieUtils;
  
/** 
 * 圖片與視訊轉換工具類 
 * 
 * @author Administrator 
 */  
public class makeVideo {  
      
    /** 
     * 將圖片轉換成視訊 
     * @param jpgDirPath jpg圖片資料夾絕對路徑 
     * @param aviFileName 生成的avi視訊檔名 
     * @param fps 每秒幀數 
     * @param mWidth 視訊的寬度 
     * @param mHeight 視訊的高度 
     * @throws Exception 
     */  
    public static void convertPicToAvi(String jpgDirPath, String aviFileName, int fps, int mWidth, int mHeight) {  
        // jpgs目錄放置jpg圖片,圖片檔名為(1.jpg,2.jpg...)  
        final File[] jpgs = new File(jpgDirPath).listFiles();  
        if(jpgs==null || jpgs.length==0){  
            return;  
        }  
  
        // 對檔名進行排序(本示例假定檔名中的數字越小,生成視訊的幀數越靠前)  
        Arrays.sort(jpgs, new Comparator<File>() {  
            public int compare(File file1, File file2) {  
                String numberName1 = file1.getName().replace(".jpg", "");  
                String numberName2 = file2.getName().replace(".jpg", "");  
                return new Integer(numberName1) - new Integer(numberName2);  
            }  
        });  
  
        // 生成視訊的名稱  
        DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider(aviFileName);  
        // 設定每秒幀數  
        dmip.setFPS(fps>0?fps:3); // 如果未設定,預設為3  
        // 設定總幀數  
        dmip.setNumberOfFrames(jpgs.length);  
        // 設定視訊寬和高(最好與圖片寬高保持一直)  
        dmip.setMWidth(mWidth>0?mWidth:1440); // 如果未設定,預設為1440  
        dmip.setMHeight(mHeight>0?mHeight:860); // 如果未設定,預設為860  
  
        try {  
            new Jim2Mov(new ImageProvider() {  
                public byte[] getImage(int frame) {  
                    try {  
                        // 設定壓縮比  
                        return MovieUtils.convertImageToJPEG((jpgs[frame]), 1.0f);  
                    } catch (IOException e) {  
                        System.err.println(e);  
                    }  
                    return null;  
                }  
            }, dmip, null).saveMovie(MovieInfoProvider.TYPE_AVI_MJPEG);  
        } catch (MovieSaveException e) {  
            System.err.println(e);  
        }  
          
        System.out.println("create avi success.");  
    }  
  
    /** 
     * main 
     * @param args 
     * @throws Exception 
     */  
    public static void main(String[] args) throws Exception {  
        String jpgDirPath = "F:/mysour/video/output/"; // jpg資料夾路徑  
        String aviFileName = "test.avi"; // 生成的avi視訊檔名(生成路徑為本工程)  
        int fps = 3; // 每秒播放的幀數  
        int mWidth = 1440; // 視訊的寬度  
        int mHeight = 860; // 視訊的高度  
        makeVideo.convertPicToAvi(jpgDirPath, aviFileName, fps, mWidth, mHeight);  
    }  
  
}  

這裡需要兩個jar包。

Jim2mov.jar、jmf.jar。

生成的avi檔案在工程目錄下。


有個問題,生成的視訊不能開啟,瀏覽器報編碼問題。

具體還要排查。

糾正一下,生成的視訊可以開啟,需要支援播放AVI格式的播放器。

如果你下載了ffmpeg。

用它自帶的ffplay也是可以播放的。

cmd中 打 ffplay test.avi

就可以了。

相關推薦

ffmpeg解析視訊java

前置條件:下載opencv的jar包匯入。ffmpeg1.需要的jar包如下:2.還有一個步驟:你下載的opencv中有兩個dll檔案。ffmpeg預設可以載入avi格式的視訊,如果想要載入MP4格式的視訊的話,需要在local.library.path路徑下放置ffmpeg

libVLC 提取視訊

什麼是幀         DVD 電影中的場景、從 YouTube 下載的剪輯、通過網路攝像頭拍攝的內容。。。無論是視訊還是動畫,都是由一系列靜止的影象組成。然後,這些影象會一個接一個的播放,讓你的眼睛誤以為物體在移動。影象的播放速度越快,動作看起來越流暢,畫面也越逼真。

京東豬臉識別比賽資料預處理:用Python將視訊提取儲存為圖片

最近參加京東的豬臉識別比賽,訓練集是30個視訊,需要將視訊的每一幀提取出來儲存為圖片,存入對應的資料夾(分類標籤)。 本例是直接呼叫了cv2 模組中的 VideoCapture。一次執行,大概10分鐘,就能得到預處理後的分類圖片了,具體程式碼如下。

OpenCV讀取視訊、OpenCV提取視訊圖片合成新的AVI視訊

CvCapture 是視訊獲取結構 被用來作為視訊獲取函式的一個引數 比如 CvCapture* cap; IplImage* cvQueryFrame( cap ); 從攝像頭或者檔案中抓取並返回一幀 #include "stdafx.h"  

取出一個位元組byte中的bit

例:byte byZT = 0x36;int n0, n1, n2, n3, n4, n5, n6, n7;n0 = (byZT & 0x01) == 0x01 ? 1 : 0; if (n0 == 0) {textBox50.Text = "正常";} else{ 

UITableView對section設定圓角

UITableViewDelegate方法中有一個方法 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndex

iphone ios取出視訊圖片關鍵,AVAssetImageGenerator

[mImageGenerator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:CMTimeMakeWithSeconds(time, NSE

獲取視訊,並儲存為.jpg圖片

#include<opencv2\opencv.hpp> #include <iostream> #include <stdio.h> #include<fstream> using namespace std; using names

opencv+vs2017實現視訊的讀取及播放,同時將圖片儲存在指定檔案

#include "highgui.h" #include <iostream> using namespace std; int main(int argc, char** argv) { cvNamedWindow("視訊播放器", CV_WINDOW_A

儲存OpenGL視窗程式碼段freeimage庫

儲存OpenGL視窗每一幀程式碼段(freeimage庫) char screenshotOrder[10]; sprintf_s(screenshotOrder, "%05d", screenshotNum); string screenshotName = screenshotOrder;

python tools:將視訊提取並儲存

Preface 最近在做 video caption 相關,要處理大量視訊。 Method 1 方法 1 是最簡單的,用 FFmpeg 工具來完成。 具體的網上有很多這方面的資料,本人只是簡單瞭解了一下如何使用。如下圖,有一個名為 ffmpeg_

原來Qt從視訊中獲取資料如此簡單

有時候需要在視訊上畫圖,所以需要能獲取到每一幀視訊資料。 以前從視訊檔案或視訊流中得到幀,一般都是使用qt + ffmpeg或qt + vlc。 qt對顯示處理視訊大體有以下方法: 1. QMediaPlayer + QVideoWidget 這種方法只適合簡單的顯示

opencv把視訊儲存為圖片

opencv3.0Beta+VS2012的視訊儲存為圖片,如果opencv版本不同引入的庫也會不一樣,大家注意!!! #include "opencv2/opencv.hpp" #include "

opencv儲存視訊

#include <opencv2/opencv.hpp>#include <tchar.h> #include <stdio.h>  #include <iostream>  #include <math.h>  #include <ostr

LibVLC for android 解碼視訊並獲取

一、背景      最近有一個需求,使用android系統的裝置,從IP攝像頭(RTSP SERVER)獲取到的視訊中的每一幀進行處理(人臉檢測),直接使用ffmpeg進行實現比較簡單,但是苦於對ffmpeg不太熟悉,獲取到的視訊延遲較高,只好轉戰看看LibVLC能否獲得更好

多執行緒例項——秒顯示次系統時間Java

“多執行緒”學過程式設計的都知道,但我現在才算真的明白他是用來幹什麼的。就像是完成某一目的,把它分成不同方向,同時執行實施,最後由主方向完成結束。這樣就達到高效率低消耗的目的了。 每一秒顯示一次系統時間,這一專案很容易但是很容易造成死迴圈而跳不出程式從而結束了,我們就可以利

如何打印棵樹Java

.get stat color util emp println style ldl 多叉樹 有一棵多叉樹,將它打印出來。 import java.util.LinkedList; /** * 需求:按層打印一棵樹 * 說明:樹是保存在一個鏈表中 *

selenium測試Java-- 組元素操作

tro itl gen () utf-8 oot clas color doctype 利用下面的例子來編寫測試腳本 頁面代碼: <!DOCTYPE html> <html> <head> <meta http-equiv="c

java使用Rome解析Rss的實例

ica cati nload summary 界面 sina uniq 作者 現在 Rome簡介 Rome是為RSS聚合而開發的開源包,它可以支持0.91、0.92、0.93、0.94、1.0、2.0,可以說rss的版本基本上都支持了。 Rss簡介 RSS是站點用來和

數據結構 - 從二叉搜索樹說到AVL樹之二叉搜索樹的操作與詳解Java

判斷 right 不為 exist avl 輸入 位置 bubuko get   二叉搜索樹(Binary Search Tree),簡稱BST,顧名思義,一顆可以用於搜索的二叉樹。BST在數據結構中占有很重要的地位,一些高級樹結構都是其的變種,例如AVL樹、紅黑樹等,因此