关于PixelFormat的优化(200分)

  • 主题发起人 主题发起人 eliuliu
  • 开始时间 开始时间
E

eliuliu

Unregistered / Unconfirmed
GUEST, unregistred user!
由于程序要在视频播放的同时进行图像质量的分析,而设置PixelFormat属性确实比较慢而且资源占用比较多,我想请教能取代PixelFormat属性而且速度和资源占用都比较小的方法。
程序部分代码,虽然是C++,但是VCL是相同的:
capGrabFrameNoStop(hCapture);
capEditCopy(hCapture);
Graphics::TBitmap *bmTest = new Graphics::TBitmap;
bmTest->Assign(Clipboard());
bmTest->PixelFormat = pf24bit;// 该设置导致了视频的停顿,但是不设置该项会导致数据的失真。
 
这个东西确实比较紧急,所以分数可以大量供应,但是一定要解决问题,呵呵。
通过设置capSetCallbackOnFrame回调函数来实现也可以,关键是要解决在进行图像分析不能影响视频流的播放,不能产生停顿感。
另,我使用了多线程来处理,可以效果还是不好,照样会产生停顿,我的图像分析是每间隔0.1s分析一次,这个算法不会占用太多资源(曾经测试过),最主要的还是
bmTest->PixelFormat = pf24bit会占用太多资源。
 
下面为设置capSetCallbackOnFrame的回调函数,但是在bmTest->LoadFromStream(stream)是报告“stream read error”错误,怀疑是从缓冲区取到MemoryStream的数据不正确,但是苦于没有相关资料,所以请大虾们帮助解决!
LRESULT CALLBACK FrameCallBack(HWND hwnd, Longint lpvhdr)
{
static BITMAPINFOHEADER BitmapHead;
static BITMAPINFO BitmapInfo;
static BITMAPFILEHEADER BitmapFileHead;
CAPSTATUS status;
int BIHsize, byte;
Byte *ptr;
LPVIDEOHDR VideoStr;
TMemoryStream *stream = new TMemoryStream;
// 取得圖片資料
VideoStr = LPVIDEOHDR(lpvhdr);
// 取得CAP訊息
capGetStatus(hwnd, &status, sizeof(status)) ;
// 取得圖片格式容量大小
BIHsize = capGetVideoFormatSize(hwnd);
// 取得圖片格式 代入 bitmapinfohead 內
capGetVideoFormat(hwnd, &BitmapHead, BIHsize);
// 設定 BITMAPINFO
BitmapInfo.bmiHeader = BitmapHead;
// 取得圖檔總容量
stream->Size = sizeof(BitmapFileHead) + sizeof(BitmapHead) + BitmapHead.biSizeImage;
// 設定 BITMAPFILEHEAD
BitmapFileHead.bfType = 0x4D42; //總是 BM
BitmapFileHead.bfSize = stream->Size; //該圖檔總大小
BitmapFileHead.bfOffBits = sizeof(BitmapFileHead) + sizeof(BitmapHead); // 偏移至imagedata大小
// 將資料存入 memorystream
stream->Position=0;
stream->WriteBuffer( &BitmapFileHead, sizeof(BitmapFileHead) );
stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) );
(void*)ptr=stream->Memory;
ptr += BitmapFileHead.bfOffBits;
Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage);
// 存入完成
stream->Position=0;
//
//bmTest为全局对象,Graphics::TBitmap类型
if(bmTest)
bmTest->LoadFromStream(stream);
delete(stream);
bAssigned = true;
capSetCallbackOnFrame(hwnd, NULL); //停止callbackonframe
return(0);
}
 

Similar threads

D
回复
0
查看
937
DelphiTeacher的专栏
D
D
回复
0
查看
892
DelphiTeacher的专栏
D
D
回复
0
查看
864
DelphiTeacher的专栏
D
后退
顶部