2

.avi ファイルから個々のフレーム (および最終的にはオーディオ) を取得しようとしています。最終的には、Java で .avi ファイルを開くことができる JNI バインド ライブラリを作成したいと考えていますが、今のところネイティブの win32 C++ で作業しています。

私はこれで頭を壁にぶつけて VFW を試してみましたが、古いビデオではほとんど機能しませんでしたが、最近のビデオのフレームを提供することをきっぱりと拒否しました. VFWが古いことを思い知らされました。

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

次に、ffmpeg が Visual Studio をサポートしていないことがわかりました。

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

コーデックに依存しない .avi デコーダ ソリューションの方向性を教えてもらえますか? できればネイティブか Java ですが、最終的には .NET を改良することもできると思います。

4

2 に答える 2

1

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

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

于 2011-06-18T05:36:45.710 に答える
0

OpenCV を試すことができます。ビデオファイルを読み取って変更する機能があり、さまざまな形式を開くことができます。C++ で利用できますが、JAVA で利用できるかどうかはわかりません。また、オーディオを解析しません。

これは、コンピュータービジョンプロジェクトで使用する私のサンプル実装です

.h ファイル

#ifndef _VPLAYER_H_

#define _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();

};

#endif

.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);  

}

void VPlayer::GetImage (IplImage* &pOutBuffer){

pOutBuffer = cvCloneImage(pFrame);

}

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

}

于 2011-06-18T07:48:46.260 に答える