[問題] 我的程式無法正常的讀寫 avi 檔案

看板Programming作者 (無家的小孩)時間18年前 (2007/05/06 20:31), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ [本文轉錄自 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,
是未壓縮格式的 avi,不過在實驗時並沒有把audio拿掉
05/06 14:00
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.112.45
文章代碼(AID): #16FSgw-B (Programming)
文章代碼(AID): #16FSgw-B (Programming)