作者addbear (无家的小孩)
看板Programming
标题[问题] 我的程式无法正常的读写 avi 档案
时间Sun May 6 20:31:53 2007
※ [本文转录自 C_and_CPP 看板]
作者: addbear (无家的小孩) 看板: C_and_CPP
标题: [问题] 我的程式无法正常的读写 avi 档案
时间: Sun May 6 01:00:41 2007
对不起再来请教各位前辈一下,
目前我利用 vc 中的 vfw32.lib 来写一个简单的 avi 拷贝程式,
可是不知道是那里要注意我没有注意到,
输出的 avi 档都因为格式错误而无法正常播放,
以下则是我利用 msdn 的范例所改写出来的程式码
======================================================================
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <windowsx.h>
#include <vfw.h>
int SaveAnother(PAVISTREAM ps, char * lpFilename)
{
PAVIFILE pf;
PAVISTREAM psSmall;
HRESULT hr;
AVISTREAMINFO strhdr;
BITMAPINFOHEADER bi;
BITMAPINFOHEADER biNew;
LONG lStreamSize;
LPVOID lpOld;
LPVOID lpNew;
AVIStreamFormatSize(ps, 0, &lStreamSize);
if (lStreamSize > sizeof(bi)){
fprintf(stderr,"\tFormat too large? \n");
return -1;
}
lStreamSize = sizeof(bi);
hr = AVIStreamReadFormat(ps, 0, &bi, &lStreamSize);
if (bi.biCompression != BI_RGB){
fprintf(stderr,"\tWrong compression format? \n");
return -1;
}
AVIStreamInfo(ps, &strhdr, sizeof(strhdr));
// Create new AVI file using AVIFileOpen.
hr = AVIFileOpen(&pf, lpFilename, OF_WRITE | OF_CREATE, NULL);
if (hr != 0){
fprintf(stderr,"Cannot open the output avi %s.\nThe message is
",lpFilename);
if(hr == AVIERR_BADFORMAT)
fprintf(stderr,"AVIERR_BADFORMAT\n");
else if(hr == AVIERR_MEMORY)
fprintf(stderr,"AVIERR_MEMORY\n");
else if(hr == AVIERR_FILEREAD)
fprintf(stderr,"AVIERR_FILEREAD\n");
else if(hr == AVIERR_FILEOPEN)
fprintf(stderr,"AVIERR_FILEOPEN\n");
else if(hr == REGDB_E_CLASSNOTREG)
fprintf(stderr,"REGDB_E_CLASSNOTREG\n");
return -1;
}
biNew = bi;
biNew.biWidth = bi.biWidth;
biNew.biHeight = bi.biHeight;
biNew.biSizeImage = bi.biSizeImage;
SetRect(&strhdr.rcFrame, 0, 0, (int) bi.biWidth, (int) bi.biHeight);
// Create a stream using AVIFileCreateStream.
hr = AVIFileCreateStream(pf, &psSmall, &strhdr);
if (hr != 0) {
fprintf(stderr,"Error while opening a video stream for writing\n");
AVIFileRelease(pf);
return -1;
}
// Set format of new stream using AVIStreamSetFormat.
hr = AVIStreamSetFormat(psSmall, 0, &biNew, sizeof(biNew));
if (hr != 0) {
fprintf(stderr,"Error while seting the stream formant of the new video
stream\n");
AVIStreamRelease(psSmall);
AVIFileRelease(pf);
return -1;
}
// Allocate memory for the bitmaps.
lpOld = GlobalAllocPtr(GMEM_MOVEABLE, bi.biSizeImage);
lpNew = GlobalAllocPtr(GMEM_MOVEABLE, biNew.biSizeImage);
// Read the stream data using AVIStreamRead.
for (lStreamSize = AVIStreamStart(ps); lStreamSize <
AVIStreamEnd(ps); lStreamSize++) {
hr = AVIStreamRead(ps, lStreamSize, 1, lpOld, bi.biSizeImage, NULL,
NULL);
if (hr != 0) {
fprintf(stderr,"Error while read image data.\nThe message is ");
switch(hr){
case AVIERR_BUFFERTOOSMALL:
fprintf(stderr,"AVIERR_BUFFERTOOSMALL.\n");
break;
case AVIERR_MEMORY:
fprintf(stderr,"AVIERR_MEMORY.\n");
break;
case AVIERR_FILEREAD:
fprintf(stderr,"AVIERR_FILEREAD.\n");
break;
}
return -1;
}
hr = AVIStreamWrite(psSmall, lStreamSize, 1, lpNew,
biNew.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
if (hr != 0) {
fprintf(stderr,"Error while writing image data.\n");
return -1;
}
}
if(!psSmall)
AVIStreamRelease(psSmall);
if(!pf)
AVIFileRelease(pf);
return 0;
}
int main(int argc, char ** argv)
{
LONG hr;
PAVIFILE pfile;
PAVISTREAM ps;
AVIFileInit();
hr = AVIFileOpen(&pfile, argv[argc-2], OF_SHARE_DENY_WRITE, 0L);
if (hr != 0){
fprintf(stderr,"Cannot open the input avi %s.\nThe message is
",argv[argc-2]);
if(hr == AVIERR_BADFORMAT)
fprintf(stderr,"AVIERR_BADFORMAT.\n");
else if(hr == AVIERR_MEMORY)
fprintf(stderr,"AVIERR_MEMORY.\n");
else if(hr == AVIERR_FILEREAD)
fprintf(stderr,"AVIERR_FILEREAD.\n");
else if(hr == AVIERR_FILEOPEN)
fprintf(stderr,"AVIERR_FILEOPEN.\n");
else if(hr == REGDB_E_CLASSNOTREG)
fprintf(stderr,"REGDB_E_CLASSNOTREG.\n");
return -1;
}
// open a video stream
hr = AVIFileGetStream(pfile, &ps, streamtypeVIDEO, 0);
if(hr !=0 ){
fprintf(stderr, "\ncould not retrieve video stream from %s!\nThe message is
", argv[argc-2]);
if(hr == AVIERR_NODATA)
fprintf(stderr,"AVIERR_NODATA.\n");
else if(hr == AVIERR_MEMORY)
fprintf(stderr,"AVIERR_MEMORY.\n");
return -1;
}
SaveAnother(ps, argv[argc-1]);
if(!pfile)
AVIFileRelease(pfile);
AVIFileExit();
return 0;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.112.45
1F:→ addbear:是未压缩格式的 avi,不过在实验时并没有把audio拿掉 05/06 14:00
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.112.45