问题是:在使用TMediaplayer组件时,用了一个imagebox把mediaplay的窗口图象
拷贝下来,但是如果把diaplayrect设得大一点,拷贝下来的是黑糊糊的。我使用的是
canvas.copyrect。你知道是怎么一回事吗?
拷贝下来,但是如果把diaplayrect设得大一点,拷贝下来的是黑糊糊的。我使用的是
canvas.copyrect。你知道是怎么一回事吗?
解决方案 »
- 急!急!
- 怎么样获取ie地址栏的url啊(急)
- 关于搜索文件问题。大家帮我看看
- 请教一下如何使用fastreport打印dbgrideh显示的内容
- 请教:我有两个同名的*.pas库(在不同的文件夹下面),我怎么在我的工程里同时包含这两个库
- 在Delphi中用adotable连接并打开access数据库中的一个含有7万多条记录的表,总是没响应?
- 【PostMessage】参数类型转换问题,描述见内,谢谢。
- 很菜鸟的问题 :由好几个form组成的程序,用什么方法关闭整个程序? close好像只能关闭打开的窗口。
- 把文件目录加到combobox的items中的问题
- 我学delphi , 有何好书介绍?
- 简单问题
- OLE调用外部程序文件:比如doc文件,判断文件是否被修改或者操作过的问题?
如果谁真的做出来了这样的东东。请给我发个短信,收我的200分!!!
新建一个工程,并将AVICAP32.PAS包含到USES中。
在Form1上放置一个TPanel控件,设Name为“gCapVideoArea”,该控件用于显示视频。再放置两个TButton控件,一个Name为“Openvideo”,另一个Name为“Closevideo”。
定义全局变量:
var
//定义捕获窗句柄
ghCapWnd: THandle;
//可以得到视频数据指针的结构变量,用于回调函数中
VideoStr: LPVIDEOHDR;
//用于设置设备属性的结构变量
CapParms: TCaptureParms;
在Name为“Openvideo”的TButton 的Click事件中写入以下代码:
procedure TForm1.OpenvideoClick(Sender: TObject);
begin
//使用Tpanel控件来创建捕获窗口
ghCapWnd := CapCreateCaptureWindow
( PChar(‘KruwoSoft'), //捕获窗口的名字
WS_CHILD or WS_VISIBLE,//窗口样式
0, //X坐标
0, //Y坐标
gCapVideoArea.Width, //窗口宽
gCapVideoArea.Height, //窗口高
gCapVideoArea.Handle, //窗口句柄
0); //一般为0
{为了能够捕获视频帧,要启动一个捕获帧回调函数VideoStreamCallBack。捕获一个视频流或当前设备状态时分别使用以下函数:
//捕获一个视频流
CapSetCallbackOnVideoStream;
//得到一个设备错误
CapSetCallbackOnError;
//得到一个设备状态
CapSetCallbackOnStatus
}
//定义一个帧捕获回调函数
CapSetCallbackOnFrame (ghCapWnd,LongInt(@VideoStreamCallBack));
//将一个捕获窗口与一个设备驱程相关联,第二个参数是个序号,当系统中装有多个显视驱动程序时,其值分别依次为0到总个数
CapDriverConnect(ghCapWnd, 0);
//设置设备属性的结构变量
CapParms.dwRequestMicroSecPerFrame:=40000;
CapParms.fLimitEnabled := FALSE;
CapParms.fCaptureAudio := FALSE; // NO Audio
CapParms.fMCIControl := FALSE;
CapParms.fYield := TRUE;
CapParms.vKeyAbort := VK_ESCAPE;
CapParms.fAbortLeftMouse := FALSE;
CapParms.fAbortRightMouse := FALSE;
//使设置生效
CapCaptureSetSetup(ghCapWnd,LongInt(@CapParms),sizeof(TCAPTUREPARMS));
//设置预览时的比例
CapPreviewScale(ghCapWnd, 1);
//设置预览时的帧频率
CapPreviewRate(ghCapWnd,66);
//如果要捕获视频流,则要使用函数指定不生成文件。否则将会自动生成AVI文件
CapCaptureSequenceNoFile(ghCapWnd);
//指定是否使用叠加模式,使用为1,否则为0
CapOverlay(ghCapWnd, 1);
//打开预览
CapPreview(ghCapWnd, 1);
end;
在Name为“Closevideo”的TButton 的Click事件中写入以下代码:
procedure TForm1.ClosevideoClick(Sender: TObject);
begin
//停止捕获
capCaptureAbort(ghCapWnd);
//将捕获窗同驱动器断开
capDriverDisconnect(ghCapWnd);
end;
定义捕获帧回调函数:
function FrameCallBack(hWnd:HWND; lpVHdr:LongInt) :LongInt; stdcall;
var
DataPoint:^byte;
DibLen,RectWidth,RectHeight:integer;
begin
//转换从回调函数中得到的指针
VideoStr:=LPVIDEOHDR(lpVHdr);
//得到返回的数据大小
DibLen:=VideoStr^.dwBufferLength;
GetMem(DataPoint,64000);
//将帧数据COPY到一个内存中,注意DATAPOINT要先分配空间
CopyMemory(DataPoint,VideoStr^.lpData,Diblen);
//一些其他处理
……
end;
利用 VC 实现AVI文件的图像截取[ 作者: 刘涛 添加时间: 2001-10-23 8:48:00 ]来源:www.yesky.com AVI文件就是我们所说的多媒体文件,所谓的AVI图像就是视频图像,该文件是一个RIFF
说明文件,它用于获取、编辑、演示音频、视频序列。一般的AVI文件包含音频流和视频流,
有的特殊的AVI还包含一个控制路径或MIDI路径作为附加的数据流。 现在播放AVI文件的软件很多,但大多无法从AVI视频文件中读取一帧图像并生成BMP格
式的文件。笔者在使用AVI文件开发项目过程中对AVI文件的操作积累了一些经验,对于如何
实现从AVI视频流中获取任意帧的图像数据并存储成BMP文件,其中最关键的是要从AVI文件
中获取具体某一帧的图像数据,为此我利用Windows提供的API函数实现了自定义的CAvi类,
用于操作AVI文件。 在使用API函数操作AVI文件时,一定要注意用AVIFileInit()来初始化AVI库,程序结束
时用AVIFileExit()释放AVI库,否则API函数无法使用。现以操作包含真彩色图像的AVI文件
为例,给出Cavi类的部分函数的具体实现,其中CaviCreate()函数用于读取AVI文件信息并
初始化Cavi类的成员,例如根据AVI文件信息定义每帧图像的宽、高、每帧图像的信息头结
构等等;函数AviRead(int mFrame)用于从AVI文件中读取第mFrame帧。实现代码显示如下://Cavi类头文件定义;
class CAvi file://AVI类,处理AVI文件
{
public:
int cy;//图象高
int cx;//图象宽
file://long m_maxFrame;
BYTE *pData;//寸储图象数据
BITMAPINFO *m_pBMI;//位图文件信息头
PAVISTREAM pavi;//AVI流
PAVIFILE pfile;//AVI文件指针
AVIFILEINFO * pfi; file://AVI信息
BOOL AviRead(int mFrame);//读AVI文件的第mFrame帧
CAvi();//标准构造函数
CAviCreate(CString &string);//用文件名初始化AVI类的成员
virtual ~CAvi();
};
//Cavi类文件实现部分;
CAvi::CAvi()
{ AVIFileInit();//初始化AVI库
cx=0;//定义图象宽、高、等成员
cy=0;
m_pBMI=NULL;
pData=NULL;
file://m_maxFrame=0;
pfi=NULL;
}
CAvi::~CAvi()//析构、释放指针
{
// AVIFileClose(pfile);
AVIFileExit();
if(pData!=NULL)
delete pData;
pData=NULL; if(m_pBMI!=NULL)
delete m_pBMI;
m_pBMI=NULL;
if(pfi!=NULL)
delete pfi;
pfi=NULL;
}
CAvi::CAviCreate(CString &string)//读文件初始化该类
{
HRESULT hr;
pfi=new AVIFILEINFO;
hr = AVIFileOpen(&pfile, // returned file pointer
string, // file name
OF_READ, // mode to open file with
NULL);
hr= AVIFileInfo(pfile, file://获取AVI信息,放入pfi中
pfi,
sizeof(AVIFILEINFO)
);
cx=pfi->dwWidth;//图象宽、高
cy=pfi->dwHeight;
hr=AVIFileGetStream(//将AVI变成视频流
pfile,
&pavi,
streamtypeVIDEO,
0//LONG lParam
);
m_pBMI=new BITMAPINFO;//定义BMP信息头
m_pBMI->bmiHeader.biBitCount=24;
m_pBMI->bmiHeader.biClrImportant=0;
m_pBMI->bmiHeader.biClrUsed=0;
m_pBMI->bmiHeader.biCompression=BI_RGB;
m_pBMI->bmiHeader.biHeight=cy;
m_pBMI->bmiHeader.biWidth=cx;
m_pBMI->bmiHeader.biPlanes=1;
m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
m_pBMI->bmiHeader.biXPelsPerMeter=0;
m_pBMI->bmiHeader.biYPelsPerMeter=0;
m_pBMI->bmiHeader.biSizeImage=cx*cy*3;
pData=(BYTE*)new char[cx*cy*3];//根据AVI中BMP图象的信息定义缓冲区
}
BOOL CAvi::AviRead(int mFrame)//将AVI文件的M帧数据读入PData缓冲区
{
HRESULT hr;
hr= AVIStreamRead( pavi,
mFrame,
1,
pData,
cx*cy*3,
NULL,
NULL
);
if(hr==0)
return TRUE;
else
return FALSE;
} 上述Cavi类实现部分所涉及到的API函数可以参考微软提供的MSDN。Cavi类中的pData缓
冲区存放AVI文件中的具体某一帧图像数据,同时Cavi类的m_pBMI为BMP图像文件信息结构,
这时可以根据图像的大小定义BMP图像文件头结构,关于BMP文件的存储,由于篇幅的原因,
我不在多讲了,有兴趣的读者可以参见笔者的拙作"Visual C++6.0开发灰度位图处理"(天
极网软件栏目2001.9.10发表),该文里面讲述了如何存取BMP文件。以上程序在
Windows2000、Visual C++6.0环境下顺利编译通过,运行正常。