微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从.avi抓取帧

如何解决从.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 \“ cv.h \”    #include \“ highgui.h \” VPlayer类{ 上市:     VPlayer();     〜VPlayer(); 私人的:
CvCapture* pAvi;
IplImage* pFrame;
上市:     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);
}
}     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。