首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从.avi抓取帧

从.avi抓取帧
EN

Stack Overflow用户
提问于 2011-06-18 12:28:18
回答 2查看 1K关注 0票数 2

我正在尝试从.avi文件中抓取单独的帧(最终是音频)。最终,我想创建一个与JNI绑定的库,使我能够用java语言打开.avi文件,但现在我使用的是原生win32 C++。

我试过VFW,但它对老的视频几乎不起作用,但它断然拒绝给我最近的视频的任何帧。我接受了VFW很旧的事实。

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

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

Java的JMF已经过时了,而且在新世纪似乎完全不受支持,而且也没有好的教程支持这一点。

谁能告诉我一个独立于编解码器的.avi解码器解决方案的方向?最好是原生的或Java的,但我猜如果到了最后我可以尝试对.NET进行改造。

EN

回答 2

Stack Overflow用户

发布于 2011-06-18 13:36:46

根据我的经验,JMF运行良好,它是非常及时的,API是非常强大的等。我写的程序,将剪辑分割成单独的帧。不幸的是,我现在不能实现任何代码样本,但据我所知,我使用了播放器和某种控件(FrmeControl或更多)。

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

票数 1
EN

Stack Overflow用户

发布于 2011-06-18 15:48:46

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

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

.h文件

代码语言:javascript
复制
#ifndef _VPLAYER_H_

#定义_VPLAYER_H_

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

类VPlayer {

公共: VPlayer();~VPlayer();

私有:

代码语言:javascript
复制
CvCapture* pAvi;
IplImage* pFrame;

CodecCode:整型高度;整型宽度;整型fps;整型;双精度;

公共:

代码语言:javascript
复制
bool LoadVideo(char * fname);
void GetFrame(int FrameNo);
void GetImage (IplImage* &pOutBuffer);
void GetProperties();

};

#endif

.cpp文件

#include "stdafx.h“#包含"VideoPlayer_PB_1.h”

bool VPlayer::LoadVideo(char * fname){

代码语言:javascript
复制
if(pAvi)cvReleaseCapture(&pAvi);
if(!(pAvi = cvCaptureFromAVI(fname)))return false;
GetProperties();
return true;

}

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

VPlayer::~VPlayer(){

代码语言:javascript
复制
cvReleaseCapture(&pAvi);

}

void VPlayer::GetFrame(int FrameNo){

代码语言:javascript
复制
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){

代码语言:javascript
复制
pOutBuffer = cvCloneImage(pFrame);

}

void VPlayer::GetProperties(){ if(pAvi){ cvQueryFrame(pAvi);//要获取正确的捕获属性,必须调用此调用

代码语言:javascript
复制
    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);
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6393871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档