寻 张铭华 -关于VFW中的视频解压缩及保存 |
尚未結案
|
guomr
一般會員 發表:2 回覆:0 積分:0 註冊:2006-11-16 發送簡訊給我 |
本人最近在书店花了较高价钱买了一本由 张铭华 编写的《多媒体视频程序设计-使用Delphi》,阅后收获甚巨,但本人最需要的视频解压缩的采集保存部分却偏偏一笔带过,所附光盘中也没有相关示例,本人新手,根据书中所列语句调试约半月余仍未果,同时书中未见 张铭华 的任何联系资料(现出版的大部分专业书籍都会有作者联系方式),只见书里写 张铭华 获Delphi K.Top讨论区奖牌,故上这寻找,希望能够取得联系和帮助,本人郭生,邮箱:guomr@worldtech.cn,QQ:39986953,Tel:020-85534711。
在此,本人将书中所列相关代码和问题列下,请本区有会的高手兄弟姐妹们指点,特别感谢。本代码目的:录制压缩视频存为avi文件,开发环境:WINXP DELPHI7。 var Fmain: TFmain; vpath:string; //当前目录,做为存放采集avi的路径 hCapWnd:THandle; capParms:TCAPTUREPARMS; insize,outsize:DWORD; compressH:HIC; pBitmapin,pBitmapout:PBITMAPINFO; compressopt:TCOMPVARS; fPreviewRate:word; fAVITempAlloc:WORD; // 暂存文件空间(单位:MB) function videostreamcallbackproc(hwnd:Thandle;lpVHdr:PVIDEOHDR):LongInt;stdcall; var pCompressdFrame:Pointer; keyframe:boolean; size:LongInt; begin pCompressdFrame:=ICSeqCompressFrame(@compressopt,0,lpVHdr^.lpdata,@keyframe,@size); end; //为书本P316页所列的视频回调函数 procedure TFmain.FormCreate(Sender: TObject); //建立主窗口同时启动视频,调试正常 begin hCapWnd:=0; fPreviewRate:=30; fAVITempAlloc:=5; fCaptureToFile:=true; FModifiedFrame:=false; vpath:=ExtractFilePath(application.ExeName); //取得当前目录,做为存放采集avi的路径 hCapWnd:=capCreateCaptureWindow('Fvideo',WS_CHILD or WS_VISIBLE,0, 0, pvideo.ClientWidth,pvideo.ClientHeight,pvideo.Handle,0); //設定CaptureWindows于pvideo版面 capDriverConnect(hCapWnd,0); capCaptureGetSetup(hCapWnd,@capParms,sizeof(capParms)); capParms.dwRequestMicroSecPerFrame:=100000; capParms.fYield:=true; capParms.fCaptureAudio:=false; capParms.fAbortLeftMouse:=false; capParms.fAbortRightMouse:=false; capCaptureSetSetup(hCapWnd,@capParms,sizeof(capParms)); capPreviewRate(hCapWnd,round(1000/fPreviewRate)); capPreview(hCapWnd,true); end; //以下程序根据书中P316页所列代码编写的采集按钮按下后的过程 procedure TFmain.BBCapVideoClick(Sender: TObject); begin if hCapWnd<>0 then begin capFileSetCaptureFile(hCapWnd,Pchar(vpath 'tmp01.tmp')); //设置暂存文件名 capFileGetCaptureFile(hCapWnd,Pchar(vpath 'tmp01.tmp'),MAX_PATH); capFileAlloc(hcapWnd,1024*1024*fAVITempAlloc); //设置数据缓冲区 compressH:=ICOpen(ICTYPE_VIDEO,mmioFOURCC('h','2','6','3'),ICMODE_FASTCOMPRESS); insize:=capGetVideoFormatsize(hCapWnd); GetMem(pBitmapIn,insize); capGetVideoFormat(hCapWnd,pBitmapIn,insize); outsize:=ICCompressGetFormatSize(compressH,pBitmapIn); //运行到本行时程序提示 Incompatible types: 'tagBITMAPINFO' and 'tagBITMAPINFOHEADER' 错误,需将pBitmapIn改为@pBitmapIn才可通过,但不知其义 GetMem(pBitmapOut,outsize); ICCompressGetFormat(compressH,pBitmapIn,pBitmapOut); ////运行到本行时程序提示 Incompatible types: 'tagBITMAPINFO' and 'tagBITMAPINFOHEADER' 错误,需将pBitmapIn改为@pBitmapIn,pBitmapOut改为@pBitmapOut将才可通过,但不知其义 compressopt.cbSize:=sizeof(TCOMPVARS); compressopt.dwFlags:=ICMF_COMPVARS_VALID; compressopt.hic:=CompressH; compressopt.lpbiOut:=pBitmapout; ICSeqCompressFrameStart(@compressopt,pBitmapIn); capSetcallbackonvideostream(hCapWnd,videostreamcallbackproc); capCaptureSequenceNoFile(hCapWnd); end; end; end. 根据原书所列代码编译通不过,经本人加了以上三处@后编译能通过,但当按下BBCapVideo接钮再停止后观察文件vpath 'tmp01.tmp',里面并没有视频可以播放。除上面所列三处错误外还有几点不明: 1. 这种函数回调压缩试频的方式对吗? 2. 程序中怎么没有保存AVI的代码,该在什么地方添加,该添加什么? 3. 除h263外,其它压缩格式的代码如何添加,比如Microsoft MPEG-4 VKI Codec 1, Intel Indeo? Video 4.5和XviD MPEG-4 Codec等? 本人新手,请勿见笑,赐教时越详细越好,最好有可以成功使用的代码范例,急用,非常感谢。 編輯記錄
taishyang 重新編輯於 2007-09-05 15:03:17, 註解 將文章分類成[問題]‧
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |