Programming 板


LINE

※ [本文轉錄自 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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP