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灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP