2011-06-18 14 views
2

.aviファイルから個々のフレーム(最終的には音声)を取得しようとしています。最終的に私はJavaで.aviファイルを開くことを可能にするJNIバインドライブラリを作りたいと思っていますが、現在はネイティブのWin32 C++で作業しています。.aviからフレームを取得する

私はVFWを試してみましたが、古いビデオではほとんど動作しませんでしたが、最近のビデオのフレームを私に与えることを断っています。私はVFWが古いことに自分自身を辞任した。

DirectShowを試してみると、それをサポートする方法に関するドキュメントは事実上なく、ストリーミングの性質上、個々のフレームグラブを吸うという記事を読んでいます。

私はffmpegがビジュアルスタジオをサポートしていないことを知ります。

JavaのJMFは時代遅れであり、新しい世紀には完全にサポートされていないようであり、そのための良いチュートリアルは存在しません。

コーデックに依存しない.aviデコーダソリューションの方向性を指摘できますか? PreferrablyネイティブまたはJavaが、私はワイヤに来る場合、私は何かを改造しようとすることができますね。

+0

を取得する必要がある以前の[FMJ(http://fmj-sf.net/)SOに述べ。投稿を覚えていないが、[多数の投稿がある](http://stackoverflow.com/search?q=fmj)。 (私はまだそれを使用していないので、品質や使いやすさについて何も言わないでください) – Atreys

答えて

1

私の経験によれば、JMFはうまく動作しますが、それは非常に最新でAPIは非常に強力です。クリップを個々のフレームに分割するプログラムを作成しました。残念ながら、私は今ではコードサンプルを得ることができませんが、私がPlayerとControl(FrmeControlなど)を使用したことを覚えていれば、

まだ何らかの理由でJMFを使用したくない場合は、コマンドラインからffmpegを呼び出すことをお勧めします。 ffmpegはビデオ処理用の非常に強力な(さらに強力な)コマンドラインユーティリティであり、複数のプラットフォームで利用できるため、アプリケーションもクロスプラットフォームにすることができます。

0

OpenCVを試すことができます。私はビデオファイルを読んだり修正したりする機能を持っており、さまざまな形式を開くことができます。 C++では利用可能ですが、JAVAで使用できるかどうかは不明です。また、オーディオを解析しません。ここで

は私のコンピュータビジョンで使用鉱山のサンプル実装が

#ifndef _VPLAYER_H_ 

の#define _VPLAYER_H_

の#include の#include の#include #

.hファイルを投影しています"cv.h"を含める #include "highgui。H」

クラスVPLAYER [ビューポート画層管理] {

公共: VPLAYER [ビューポート画層管理](); 〜VPLAYER [ビューポート画層管理]();

プライベート:

CvCapture* pAvi; 
IplImage* pFrame; 

公共: int型の高さ; int型の幅; int fps; int numFrames; 倍のコーデックコード;

公共:

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

}。

.cppファイル

の#include "STDAFX.H" の#include "VideoPlayer_PB_1.h"

ブールVPLAYER [ビューポート画層管理] :: LoadVideo(チャー*のFNAME){

#ENDIF
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); 
} 

}

関連する問題