簡體   English   中英

.avi的抓幀

[英]Grabbing frames from .avi

我正在嘗試從.avi文件中抓取單個幀(並最終獲取音頻)。 最終,我想制作一個JNI綁定的庫,該庫允許我用Java打開.avi文件,但現在我正在使用本機win32 C ++。

我一直在用這種方法把頭撞在牆上,嘗試了VFW,它幾乎不能用於較舊的視頻,但是它斷然拒絕給我任何最新視頻的畫面。 我辭職了,以為VFW很老。

嘗試DirectShow時,我幾乎找不到有關如何支持它的文檔,並且收看一些文章說,由於其流式傳輸特性,它在各個幀抓取中都很爛。

然后我發現ffmpeg甚至不支持Visual Studio。

Java的JMF已經過時了,並且在新世紀似乎也不被完全支持,為此也沒有很好的教程。

誰能指出我與編解碼器無關的.avi解碼器解決方案的方向? 最好是本機或Java,但是我想我可以嘗試對.NET進行改造,如果它確實可用的話。

根據我的經驗,JMF可以很好地工作,它是最新的,API非常強大,等等。我編寫了將剪輯拆分為單個幀的程序。 不幸的是,我現在無法獲得任何代碼示例,但據我所記得,我曾經使用Player和某種控件(FrmeControl左右)。

如果出於某些原因您仍然不想使用JMF,建議您從命令行調用ffmpeg。 由於ffmpeg是用於視頻處理的非常強大(甚至最強大)的命令行實用程序,並且可用於多個平台,因此您的應用程序也可以跨平台。

您可以嘗試使用OpenCV。 我具有讀取和修改視頻文件的功能,並且可以打開多種格式。 它可用於C ++,但不確定是否可用於JAVA。 而且它不會解析音頻。

這是我在計算機視覺項目中使用的我的示例實現

.h文件

#ifndef _VPLAYER_H_

#定義_VPLAYER_H_

#include #include #include #include“ cv.h” #include“ highgui.h”

VPlayer類{

公共:VPlayer(); 〜VPLAYER();

私人的:

CvCapture* pAvi;
IplImage* pFrame;

public:int高度; int寬度; int fps; int numFrames; 雙重CodecCode;

上市:

bool LoadVideo(char * fname);
void GetFrame(int FrameNo);
void GetImage (IplImage* &pOutBuffer);
void GetProperties();

};

#萬一

.cpp文件

#include“ stdafx.h” #include“ VideoPlayer_PB_1.h”

bool VPlayer :: LoadVideo(char * fname){

if(pAvi)cvReleaseCapture(&pAvi);
if(!(pAvi = cvCaptureFromAVI(fname)))return false;
GetProperties();
return true;

}

VPlayer :: VPlayer(){pAvi = 0; pFrame = 0; }

VPLAYER ::〜VPLAYER(){

cvReleaseCapture(&pAvi);

}

無效VPlayer :: GetFrame(int FrameNo){

cvSetCaptureProperty(pAvi,CV_CAP_PROP_POS_FRAMES,FrameNo);

if(!cvGrabFrame(pAvi)){              // capture a frame 
    printf("Could not grab a frame\n\7");
    exit(0);
}
pFrame = cvRetrieveFrame(pAvi);  

}

無效VPlayer :: GetImage(IplImage *&pOutBuffer){

pOutBuffer = cvCloneImage(pFrame);

}

無效VPlayer :: GetProperties(){if(pAvi){cvQueryFrame(pAvi); //此調用對於獲取正確的捕獲屬性是必需的

    Height = (int) cvGetCaptureProperty(pAvi, CV_CAP_PROP_FRAME_HEIGHT);

    Width = (int) cvGetCaptureProperty(pAvi, CV_CAP_PROP_FRAME_WIDTH);

    fps       = (int) cvGetCaptureProperty(pAvi, CV_CAP_PROP_FPS);

    numFrames = (int) cvGetCaptureProperty(pAvi,  CV_CAP_PROP_FRAME_COUNT);

    CodecCode = cvGetCaptureProperty(pAvi, CV_CAP_PROP_FOURCC);
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM