从.avi抓取框架

时间:2011-06-18 04:28:18

标签: java c++ avi

我正试图从.avi文件中获取单个帧(最终是音频)。最后我想创建一个JNI绑定库,允许我用Java打开.avi文件,但是现在我正在使用本机win32 C ++。

我一直在用这个尝试过的VFW撞墙,但它几乎不适用于较旧的视频,但它断然拒绝给我任何更近期视频的画面。我辞职了,因为VFW已经老了。

在尝试DirectShow时,我发现几乎没有关于如何支持它的文档,并最终阅读文章说由于其流媒体特性而导致单个帧抓取很糟糕。

然后我发现ffmpeg甚至不支持visual studio。

Java的JMF已经过时,在新世纪似乎完全没有支持,也没有很好的教程。

有人能指出我与编解码器无关的.avi解码器解决方案的方向吗?最好是原生的或Java,但我想我可以尝试改进一些.NET,如果它归结为电线。

2 个答案:

答案 0 :(得分:1)

根据我的经验,JMF工作正常,它是非常新的,API非常强大等等。我编写的程序将剪辑分成单独的帧。不幸的是我现在无法实现任何代码示例,但据我记得我使用了Player和某种Control(FrmeControl等)。

如果由于某种原因您仍然不想使用JMF,我建议您从命令行调用ffmpeg。由于ffmpeg是一个非常强大(甚至是最强大的)用于视频处理的命令行实用程序,并且可用于多个平台,因此您的应用程序也可以是跨平台的。

答案 1 :(得分:0)

您可以尝试OpenCV。我有阅读和修改视频文件的功能,它可以打开各种格式。它适用于C ++,但不确定它是否适用于JAVA。它也不会解析音频。

以下是我在计算机视觉项目中使用的示例实现

.h文件

#ifndef _VPLAYER_H_

#define _VPLAYER_H _

的#include    #包括    #包括    #include“cv.h”    #include“highgui.h”

类VPlayer {

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

私人:

CvCapture* pAvi;
IplImage* pFrame;

公共:     int高度;     int宽度;     int fps;     int numFrames;     double 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);

}

void 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(){     如果(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);
}

}