我正在尝试从.avi文件中抓取单独的帧(最终是音频)。最终,我想创建一个与JNI绑定的库,使我能够用java语言打开.avi文件,但现在我使用的是原生win32 C++。
我试过VFW,但它对老的视频几乎不起作用,但它断然拒绝给我最近的视频的任何帧。我接受了VFW很旧的事实。
在尝试DirectShow时,我发现几乎没有关于如何支持它的文档,最后阅读的文章说,由于它的流媒体性质,它对于单个帧的抓取很糟糕。
然后我发现ffmpeg甚至不支持visual studio。
Java的JMF已经过时了,而且在新世纪似乎完全不受支持,而且也没有好的教程支持这一点。
谁能告诉我一个独立于编解码器的.avi解码器解决方案的方向?最好是原生的或Java的,但我猜如果到了最后我可以尝试对.NET进行改造。
发布于 2011-06-18 13:36:46
根据我的经验,JMF运行良好,它是非常及时的,API是非常强大的等。我写的程序,将剪辑分割成单独的帧。不幸的是,我现在不能实现任何代码样本,但据我所知,我使用了播放器和某种控件(FrmeControl或更多)。
如果由于某些原因,您仍然不想使用JMF,我建议您从命令行调用ffmpeg。由于ffmpeg是一个非常强大(甚至是最强大)的视频处理命令行实用程序,并且可用于多个平台,因此您的应用程序也可以是跨平台的。
发布于 2011-06-18 15:48:46
你可以试试OpenCV。我有读取和修改视频文件的功能,它可以打开各种格式。它可用于C++,但不确定是否可用于JAVA。它也不会解析音频。
下面是我在计算机视觉项目中使用的我的示例实现
.h文件
#ifndef _VPLAYER_H_#定义_VPLAYER_H_
#include #include "cv.h“#include "highgui.h”
类VPlayer {
公共: VPlayer();~VPlayer();
私有:
CvCapture* pAvi;
IplImage* pFrame;CodecCode:整型高度;整型宽度;整型fps;整型;双精度;
公共:
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){
if(pAvi)cvReleaseCapture(&pAvi);
if(!(pAvi = cvCaptureFromAVI(fname)))return false;
GetProperties();
return true;}
pFrame::VPlayer(){ pAvi =0;VPlayer= 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(){ 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);
}}
https://stackoverflow.com/questions/6393871
复制相似问题