请问,VFW视频流存储为AVI文件,应该怎么做!欢迎一起讨论!
我现在视频采集,压缩,显示都做好了.
在视频回调函数中压缩(用的是Buf := ICSeqCompressFrame(@CapVar,0,lpVhdr.lpData,@bKeyFrame,@OutActSize);)之后的数据Buf存储为AVI文件播放,但是播放不了.
请知道的高手帮助解决!
存储代码如下:
//--------------压缩图像参数声明----------------
// 视频数据格式
bBitMapInFo : PBItmapInfo;
OutFormatSize : DWORD;
//--------------压缩图像参数声明----------------
//--------------存储AVI文件参数声明----------------
favifile: IAVIFILE;
AVIStream : IAVISTREAM;
nFrames : Integer;
//--------------存储AVI文件参数声明----------------
function TFromVdisplayWin.SaveAVIFileInit: Boolean;
var
szFile : string;
iRes : Integer;
StreamInfo : TAVIStreamInfo;
begin
try
Result := False;
AVIFileInit;
iRes := 0;
nFrames := 0;
szFile := SaveToAVIFile(FormatDateTime( 'hh-nn ',Now));
iRes := AVIFileOpen(fAVIFile,PChar(szFile),OF_CREATE,nil);
Result := True;
if iRes <> AVIERR_OK then
begin
WriteErrorFile(ErrorFile, '未连接 ', '调用AVI函数库初始化错误 ');
Result := False;
end;
FillChar(StreamInfo, sizeof(StreamInfo), 0);
StreamInfo.fccType := streamtypeVIDEO;
StreamInfo.fccHandler := 0;
StreamInfo.dwFlags := 0;
StreamInfo.dwSuggestedBufferSize := BmpOutInfo^.bmiHeader.biSizeImage;
StreamInfo.rcFrame.Right := BmpOutInfo^.bmiHeader.biWidth;
StreamInfo.rcFrame.Bottom := BmpOutInfo^.bmiHeader.biHeight;
StreamInfo.dwScale := 1;
StreamInfo.dwRate := 30;
if (AVIFileCreateStream(fAVIFile, AVIStream, StreamInfo) <> 0) then
raise Exception.Create( '创建avi流失败 ');
AVIStreamSetFormat(AVIStream,nFrames,BmpOutInfo,SizeOf(BmpOutInfo));
except
on E:Exception do
begin
Result := False;
WriteErrorFile(ErrorFile, '未知,存储视频文件初始化 ', '错误: '+E.Message);
end;
end;
end;
procedure TFromVdisplayWin.SaveAVIFileEnd;
begin
try
AVIStreamClose(AVIStream);
if(fAVIFile <> nil) then
AVIFileRelease(fAVIFile);
AVIFileExit();
except
on E:Exception do
begin
WriteErrorFile(ErrorFile, '存储视频文件结束 ', '错误: '+E.Message);
end;
end;
end;
在回调函数中加
OutActSize := bBitMapInfo.bmiHeader.biSizeImage;
Buf := ICSeqCompressFrame(@CapVar,0,lpVhdr.lpData,@bKeyFrame,@OutActSize);
AVIStreamWrite(AVIStream,LONG(nFrames),1,Buf,BmpOutInfo.bmiHeader.biSizeImage,
AVIIF_KEYFRAME,nil,nil);
请各位高手帮助,有例子更好.
如果有需要我可以帖出代码来.
欢迎志同道合的朋友一起讨论.我的Email: qqx266152@163.com
[解决办法]
找一本专门的介绍多媒体编程的书去看看,这个好像有专门的包,你去看看,这块我也不是很清楚,只有帮你顶起来,一起学习。。
[解决办法]
VFW效果太差~,已被淘汰的
现在都推荐用DirectShow的
[解决办法]
StreamInfo.fccHandler ,BmpOutInfo.bmiHeader.biCompression和CapVar.fccHandler这3个成员表示的就是你所说的图象格式。