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樹、紅黑樹等,因此