我正试图从.avi文件中获取单个帧(最终是音频)。最后我想创建一个JNI绑定库,允许我用Java打开.avi文件,但是现在我正在使用本机win32 C ++。
我一直在用这个尝试过的VFW撞墙,但它几乎不适用于较旧的视频,但它断然拒绝给我任何更近期视频的画面。我辞职了,因为VFW已经老了。
在尝试DirectShow时,我发现几乎没有关于如何支持它的文档,并最终阅读文章说由于其流媒体特性而导致单个帧抓取很糟糕。
然后我发现ffmpeg甚至不支持visual studio。
Java的JMF已经过时,在新世纪似乎完全没有支持,也没有很好的教程。
有人能指出我与编解码器无关的.avi解码器解决方案的方向吗?最好是原生的或Java,但我想我可以尝试改进一些.NET,如果它归结为电线。
答案 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);
}
}