線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2753
推到 Plurk!
推到 Facebook!

寻 张铭华 -关于VFW中的视频解压缩及保存

尚未結案
guomr
一般會員


發表:2
回覆:0
積分:0
註冊:2006-11-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-11-22 17:59:49 IP:58.62.xxx.xxx 訂閱
本人最近在书店花了较高价钱买了一本由 张铭华 编写的《多媒体视频程序设计-使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-05 10:44:03 IP:61.218.xxx.xxx 訂閱

這本書 在 大陸 出版 本人 並 不知情 2006.10 的事 我到 2007.09 才發現

金禾 並未告知 本人 有點可惡


------
︿︿
系統時間:2024-05-17 18:47:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!