你可以试试 OpenCV。我有读取和修改视频文件的功能,它可以打开多种格式。它适用于 C++,但不确定它是否适用于 JAVA。它也不会解析音频。
这是我在计算机视觉项目中使用的示例实现
.h 文件
#ifndef _VPLAYER_H_
#define _VPLAYER_H_
#包括
#包括
#包括
#包括“cv.h”
#include "highgui.h"
类VPlayer {
公开:
VPlayer();
~VPlayer();
私人:
CvCapture* pAvi;
IplImage* pFrame;
公开:
整数高度;
整数宽度;
帧速率;
整数帧数;
双编解码器;
公开:
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);
}
}