[問題] 我的程式無法正常的讀寫 avi 檔案
※ [本文轉錄自 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
→
05/06 14:00,
05/06 14:00
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.112.45
Programming 近期熱門文章
PTT數位生活區 即時熱門文章