如何将两个AVI文件合并成一个文件啊,我愚昧了……

时间:2021-11-04 20:00:34
如何将两个AVI文件合并成一个文件,方法不限啊,但要可以播放啊,我的VC是初学的希望大家多来点代码和注释才好,谢谢啊

19 个解决方案

#1


用Windows Media Encoder就可以……

#2


mark

#3


DirectShow Editing Services

#4


VFW: AVIEdit
DS: AVIMuxer

#5


自己根据该文件格式进行读写合并操作,或者直接调用别人写好的相关组件

#6


大家的方法能不能具体点啊,好多术语都不懂啊,谢谢同志们

#7


用Windows Media Encoder就可以……
==================
确实可以,但是如果要编程实现,需要安装Windows Media Encoder 9 Series SDK!到MS的网站上去找找吧,以前是可以下载到的。

#8


Windows Media Encoder是什么啊?不知道啊
Windows Media Encoder 9 Series SDK需要正版用户啊,俺没钱啊

#9


自己UP啊,Windows Media Encoder今天终于见了,没见合并的功能啊,还有我确实是要编程实现的,大家帮忙下啊

#10


关于avi文件的合并,其实是比较不容易的事情,首先,因为每个avi文件虽然后缀都是avi,但是采用的压缩方式有可能不同,必然有的是 mepg4,有的是jepg,也可能其他的压缩方式.还有其中的视频和音频流的格式也许不一样,我觉得,如果两个avi文件的格式完全相同,压缩方式也一样的话,合并应该没有问题.

至于合并的方式,我建议采用avi系列函数,将两个avi文件中的视频流和音频流读出来,重新写一个新的文件,下面我贴出avi系列API函数的简介,希望对楼主有所帮助

1AVIBuildFilter
2AVIClearClipboard
3AVIFileAddRef
4AVIFileCreateStream
5AVIFileEndRecord
6AVIFileExit
7AVIFileGetStream
8AVIFileInfo
9AVIFileInit
10AVIFileOpen
11AVIFileReadData
12AVIFileRelease
13AVIFileWriteData
14AVIGetFromClipboard
15AVIMakeCompressedStream
16AVIMakeFileFromStreams
17AVIMakeStreamFromClipboard
18AVIPutFileOnClipboard

19AVISave
20AVISaveOptions
21AVISaveOptionsFree
22AVISaveV

23AVIStreamAddRef
24AVIStreamBeginStreaming
25AVIStreamCreate
26AVIStreamEndStreaming
27AVIStreamFindSample
28AVIStreamGetFrame
29AVIStreamGetFrameClose
30AVIStreamGetFrameOpen
31AVIStreamInfo
32AVIStreamLength
33AVIStreamOpenFromFile
34AVIStreamRead
35AVIStreamReadData
36AVIStreamReadFormat
37AVIStreamRelease
38AVIStreamSampleToTime
39AVIStreamSetFormat
40AVIStreamStart
41AVIStreamTimeToSample
42AVIStreamWrite
43AVIStreamWriteData

44CreateEditableStream
45EditStreamClone
46EditStreamCopy
47EditStreamCut
48EditStreamPaste
49EditStreamSetInfo
50EditStreamSetName

#11


总共50个函数,他们的用途主要有两类,一个是avi文件的操作,一类是数据流streams的操作。下面分别解析。
1文件操作
1.1打开和关闭文件
  AVIFileOpen ,AVIFileAddRef,
  AVIFileRelease
1.2从文件中读取文件信息
通过AVIFileInfo可以获取avi文件的一些信息,这个函数返回一个AVIFILEINFO结构
通过AVIFileReadData可以用来获取AVIFileInfo函数得不到的信息。这些信息也许不包含在文件的头部,比如拥有file的公司和个人的名称。
1.3写入文件信息
可以通过AVIFileWriteData函数来写入文件的一些额外信息。
1.4使用粘贴板
  AVIPutFileOnClipboard函数可以将一个avi复制到粘贴板上
  AVIGetFromClipboard函数可以将粘贴板上的avi写入到内存或者硬盘中。
  AVIClearClipboard用来清除粘贴板
2数据流操作
2.1打开和关闭一个流
 打开一个数据流就跟打开文件一样,你可以通过 AVIFileGetStream函数来打开一个数据流,这个函数创建了一个流的接口,然后在该接口中保存了一个句柄。
 如果你想操作文件的某一个单独的流,你可以采用AVIStreamOpenFromFile函数,这个函数综合了AVIFileOpen和AVIFileGetStream函数。
 如果你想操作文件中的多个数据流,你就要首先AVIFileOpen,然后AVIFileGetStream。

 可以通过AVIStreamAddRef来增加stream接口的引用。
通过AVIStreamRelease函数来关闭数据流。这个函数用来减少streams的引用计数,当计数减少为0时,删除。
2.2从流中读取数据和信息
AVIStreamInfo函数可以获取数据的一些信息,该函数返回一个AVISTREAMINFO结构,该结构包含了数据的类型压缩方法,建议的buffersize,回放的rate,以及一些description。
   如果数据流还有一些其它的额外的信息,你可以通过AVIStreamReadData函数来获取。应用程序分配一个内存,传递给这个函数,然后这个函数会通过这个内存返回数据流的信息,额外的信息可能包括数据流的压缩和解压缩的方法,你可以通过AVIStreamDataSize宏来回去需要申请内存块的大小。
   可以通过AVIStreamReadFormat函数获取数据流的格式信息。这个函数通过指定的内存返回数据流的格式信息,比如对于视频流,这个buffer包含了一个BIMAPINFO结构,对于音频流,内存块包含了WAVEFORMATEX或者PCMAVEFORMAT结构。你可以通过给AVIStreamReadFormat传递一个空buffer就可以获取buffer的大小。也可以通过AVIStreamFormatSize宏。
  可以通过AVIStreamRead函数来返回多媒体的数据。这个函数将数据复制到应用程序提供的内存中,对于视频流,这个函数返回图像祯,对于音频流,这个函数返回音频的sample数据。可以通过给AVIStreamRead传递一个NULL的buffer来获取需要的buffer的大小。也可以通过AVIStreamSampleSize宏来获取buffer的大小。
  有些AVI数据流句柄可能需要在启动数据流的前要做一下准备工作,此时,我们可以调用AVIStreamBeginStreaming函数来告知AVI数据流handle来申请分配它需要的一些资源。在完毕后,调用AVIStreamEndStreamming函数来释放资源。
2.3操作压缩的视频数据
  如果你要演示一祯或者几祯压缩视频图像时,你可以调用AVIStreamRead函数,将获取的数据传递给DrawDib函数来显示图像。这些函数可以显示压缩和未压缩的图像。
  AVIFile也提供了一个函数AVIStreamGetFrameOpen,来获取未压缩的视频祯,这个函数创建了内存来获取未压缩的数据。也可以通过AVIStreamGetFrame函数来解压缩一个单独的视频祯。这个函数可以解压缩某一祯图像,然后将数据以一个BIMAPINFOHEADER结构返回。当你调用完AVIStreamGetFrame函数后,要调用AVIStreamGetFrameClose函数释放上一个函数申请的资源。
2.4根据已存在的数据流创建文件
   创建一个包含多个数据流的文件的方法就是整合多个数据流,将其写入一个新文件。这些数据流可以是内存中的数据,也可以是存在于另一个文件中。
  我们可以用AVISave这个函数来build一个文件。这个函数可以创建一个文件,并且将指定的多个数据流按照指定的顺序写入文件,你也可以通过AVISaveV函数来创建一个新的文件,这个函数的功能和AVISave的功能一样,主要区别是AVISaveV采用的数据流数组,而AVISave是单个的数据流,多次保存。
  我们可以调用AVISaveOptions函数来显示一个对话框,可以让用户来选择压缩方式。
  我们可以在调用AVISave和AVISaveV函数时指定一个回调函数,用来显示avi文件的生成进度,可以让用户随时地取消生成avi文件。
  我们可以调用GetSaveFileNamePreview函数来显示保存的对话框让用户选择保存的文件名。
  通过AVIMakeFileFromStreams函数我们可以创建一个虚拟的文件句柄,其他的avi函数可以通过这个虚拟的文件句柄来操作文件中的数据流,操作完毕要记得调用AVIFileRelease释放。
2.5向文件写入一个数据流
 我们可以通过AVIFileCreateStream函数来在一个新文件或者已经存在的文件中创建一个数据流。这个函数根据AVISTREAMINFO结构定义了新的数据流,并为新的数据流创建一个接口,返回接口的指针。
  在写入新的数据前,一定要指定流的格式信息,通过AVIStreamSetFormat函数,当设置一个视频流的时候,一定要使用BIMAPINFO结构来设置,音频就用WAVEFORMAT。
  然后我们就可以通过AVIStreamWrite函数将我们的多媒体数据写入数据流了。这个函数将应用程序提供的内存数据复制到指定的流。缺省的avi handler将数据写入流的最后。
  如果你有其他额外的信息需要写入流,你可以调用AVIFileWriteData或者AVIStreamWriteData,
 最后记得在完成数据写入后,要调用AVIStreamRelease。
2.6数据流中的祯的位置
 寻找起始祯:
  可以通过AVIStreamStart函数来获取第一祯包含的sample number。也可以通过AVIStreamInfo函数来获取这个信息,这个函数的AVISTREAMINFO结构中包含了dwStart,可以通过AVIStreamStartTime宏来获取第一个sample。
  可以通过AVIStreamLength函数来获取流的长度。这个函数返回流中的sample的数目。也可以通过AVIStreamInfo函数来获取这些信息,可以通过AVIStreamLengthTime宏来获取流的长度,毫秒。
  在视频流中,一个sample对应着一祯图像,所以,有时这些sample中没有视频数据,如果你调用AVIStreamRead函数来数据,可能返回NULL,也可以通过AVIStreamFindSample通过指定FIND_ANY标志来查找指定的sample。
查找关键祯
通过AVIStreamFindSample函数查找符合要寻找的sample,然后可以通过下面的宏判断是否关键祯。
在time和sample间互相切换
 AVIStreamSampleToTime这个函数可以将smaple转换成毫秒。对于视频,这个值代表的是这个祯开始播放的时间,
 AVIStreamTimeToSample
2.7 创建临时的streams
 我们可以通过AVIStreamCreate函数在内存中创建一个临时数据流,
 我们可以从一个未压缩的数据流创建一个压缩的数据流,采用AVIMakeCompressedStream函数,
 当我们使用完 avistreamcreate或者avimakecompressedstream创建的数据流,要一定使用AVIStreamRelease函数来关闭数据流。
2.8对数据流进行编辑
 我们可以通过CreateEditableStream函数来创建一个用于编辑的数据流。这个函数初始化了编辑流的环境

#12


这些是我自己整理的,具体的你可以参考MSDN,我也是从上面摘抄下来的,因为最近在写avi文件

#13


呵呵,谢谢 aoosang(智慧的鱼) 同志啊,这个我收了,先研究下……

#14


http://hqtech.nease.net/Article/DS_AVIFileFormat.htm

#15


jx

#16


哦,我还要说两句啊,我处理的是是两个格式完全一样,没有声音的AVI文件

#17


PAVIFILE  pfile1, pfile2, pfile3;                                      
          AVIFILEINFO    pfi;                          
          PAVISTREAM pavi1, pavi2;
          AVISTREAMINFO    strhdr; 
          BITMAPINFOHEADER bi;           
          LONG             lStreamStart; 
          LONG             lStreamSize; 
          LPVOID           lpData1;  
          LPVOID           lpData2;  


 
           //initializes  the  AVIFile  library,同AVIFileExit()对应。  
           //Call  AVIFileInit()  before  using  any  other  AVIFile  functions      
           AVIFileInit();  
           AVIFileOpen(&pfile1, "a.avi",OF_READ  ¦OF_SHARE_DENY_NONE,NULL);    
            AVIFileOpen(&pfile2, "b.avi",OF_READ  ¦OF_SHARE_DENY_NONE,NULL);      
           AVIFileGetStream(pfile1,&pavi1,streamtypeVIDEO,0);       
           AVIFileGetStream(pfile2,&pavi2,streamtypeVIDEO,0);
           AVIFileOpen(&pfile3, "c.avi",OF_WRITE  ¦ OF_CREATE, NULL);PAVIFILE         pf; 
           AVIStreamFormatSize(pavi1, 0, &lStreamSize); 
 
          lStreamSize = sizeof(bi); 
          AVIStreamReadFormat(pavi1, 0, &bi, &lStreamSize); // Read format 
  
          AVIStreamInfo(pavi1, &strhdr, sizeof(strhdr)); 
 
    
  
          AVIFileCreateStream(pfile3, &pavi3, &strhdr); 
  
    // Set format of new stream using AVIStreamSetFormat. 
          AVIStreamSetFormat(pavi3, 0, &bi, sizeof(bi));  
    // Allocate memory for the bitmaps. 
   lStreamStart = AVIStreamStart(pavi1);
   lStreamSize = AVIStreamLength(pavi1);

    lpData1 = GlobalAllocPtr(GMEM_MOVEABLE, bi.biSizeImage*lStreamSize );    
        AVIStreamRead(pavi1, lStreamStart , lStreamSize , lpData1,bi.biSizeImage*lStreamSize ,
            NULL, NULL); 
             AVIStreamWrite(pavi3, lStreamStart , lStreamSize , lpData1,
            bi.biSizeImage*lStreamSize, AVIIF_KEYFRAME, NULL, NULL); 
int pos = AVIStreamEnd(pavi1);
  lStreamStart = AVIStreamStart(pavi2);
   lStreamSize = AVIStreamLength(pavi2);

    lpData2 = GlobalAllocPtr(GMEM_MOVEABLE, bi.biSizeImage*lStreamSize );    
        AVIStreamRead(pavi2, lStreamStart , lStreamSize , lpData1,bi.biSizeImage*lStreamSize ,
            NULL, NULL); 
             AVIStreamWrite(pavi3, pos, lStreamSize , lpData1,
            bi.biSizeImage*lStreamSize, AVIIF_KEYFRAME, NULL, NULL); 

 
    AVIStreamRelease(pavi1);   
 AVIStreamRelease(pavi2);
    AVIStreamRelease(pavi3); 
    AVIFileRelease(pfile1); 
    AVIFileRelease(pfile2); 
    AVIFileRelease(pfile3); 

           

#18


上面的程序运行不起来,老出错,所以再次顶上来了。希望大家再多多帮忙啊,谢谢

#19


可以吧,!

#1


用Windows Media Encoder就可以……

#2


mark

#3


DirectShow Editing Services

#4


VFW: AVIEdit
DS: AVIMuxer

#5


自己根据该文件格式进行读写合并操作,或者直接调用别人写好的相关组件

#6


大家的方法能不能具体点啊,好多术语都不懂啊,谢谢同志们

#7


用Windows Media Encoder就可以……
==================
确实可以,但是如果要编程实现,需要安装Windows Media Encoder 9 Series SDK!到MS的网站上去找找吧,以前是可以下载到的。

#8


Windows Media Encoder是什么啊?不知道啊
Windows Media Encoder 9 Series SDK需要正版用户啊,俺没钱啊

#9


自己UP啊,Windows Media Encoder今天终于见了,没见合并的功能啊,还有我确实是要编程实现的,大家帮忙下啊

#10


关于avi文件的合并,其实是比较不容易的事情,首先,因为每个avi文件虽然后缀都是avi,但是采用的压缩方式有可能不同,必然有的是 mepg4,有的是jepg,也可能其他的压缩方式.还有其中的视频和音频流的格式也许不一样,我觉得,如果两个avi文件的格式完全相同,压缩方式也一样的话,合并应该没有问题.

至于合并的方式,我建议采用avi系列函数,将两个avi文件中的视频流和音频流读出来,重新写一个新的文件,下面我贴出avi系列API函数的简介,希望对楼主有所帮助

1AVIBuildFilter
2AVIClearClipboard
3AVIFileAddRef
4AVIFileCreateStream
5AVIFileEndRecord
6AVIFileExit
7AVIFileGetStream
8AVIFileInfo
9AVIFileInit
10AVIFileOpen
11AVIFileReadData
12AVIFileRelease
13AVIFileWriteData
14AVIGetFromClipboard
15AVIMakeCompressedStream
16AVIMakeFileFromStreams
17AVIMakeStreamFromClipboard
18AVIPutFileOnClipboard

19AVISave
20AVISaveOptions
21AVISaveOptionsFree
22AVISaveV

23AVIStreamAddRef
24AVIStreamBeginStreaming
25AVIStreamCreate
26AVIStreamEndStreaming
27AVIStreamFindSample
28AVIStreamGetFrame
29AVIStreamGetFrameClose
30AVIStreamGetFrameOpen
31AVIStreamInfo
32AVIStreamLength
33AVIStreamOpenFromFile
34AVIStreamRead
35AVIStreamReadData
36AVIStreamReadFormat
37AVIStreamRelease
38AVIStreamSampleToTime
39AVIStreamSetFormat
40AVIStreamStart
41AVIStreamTimeToSample
42AVIStreamWrite
43AVIStreamWriteData

44CreateEditableStream
45EditStreamClone
46EditStreamCopy
47EditStreamCut
48EditStreamPaste
49EditStreamSetInfo
50EditStreamSetName

#11


总共50个函数,他们的用途主要有两类,一个是avi文件的操作,一类是数据流streams的操作。下面分别解析。
1文件操作
1.1打开和关闭文件
  AVIFileOpen ,AVIFileAddRef,
  AVIFileRelease
1.2从文件中读取文件信息
通过AVIFileInfo可以获取avi文件的一些信息,这个函数返回一个AVIFILEINFO结构
通过AVIFileReadData可以用来获取AVIFileInfo函数得不到的信息。这些信息也许不包含在文件的头部,比如拥有file的公司和个人的名称。
1.3写入文件信息
可以通过AVIFileWriteData函数来写入文件的一些额外信息。
1.4使用粘贴板
  AVIPutFileOnClipboard函数可以将一个avi复制到粘贴板上
  AVIGetFromClipboard函数可以将粘贴板上的avi写入到内存或者硬盘中。
  AVIClearClipboard用来清除粘贴板
2数据流操作
2.1打开和关闭一个流
 打开一个数据流就跟打开文件一样,你可以通过 AVIFileGetStream函数来打开一个数据流,这个函数创建了一个流的接口,然后在该接口中保存了一个句柄。
 如果你想操作文件的某一个单独的流,你可以采用AVIStreamOpenFromFile函数,这个函数综合了AVIFileOpen和AVIFileGetStream函数。
 如果你想操作文件中的多个数据流,你就要首先AVIFileOpen,然后AVIFileGetStream。

 可以通过AVIStreamAddRef来增加stream接口的引用。
通过AVIStreamRelease函数来关闭数据流。这个函数用来减少streams的引用计数,当计数减少为0时,删除。
2.2从流中读取数据和信息
AVIStreamInfo函数可以获取数据的一些信息,该函数返回一个AVISTREAMINFO结构,该结构包含了数据的类型压缩方法,建议的buffersize,回放的rate,以及一些description。
   如果数据流还有一些其它的额外的信息,你可以通过AVIStreamReadData函数来获取。应用程序分配一个内存,传递给这个函数,然后这个函数会通过这个内存返回数据流的信息,额外的信息可能包括数据流的压缩和解压缩的方法,你可以通过AVIStreamDataSize宏来回去需要申请内存块的大小。
   可以通过AVIStreamReadFormat函数获取数据流的格式信息。这个函数通过指定的内存返回数据流的格式信息,比如对于视频流,这个buffer包含了一个BIMAPINFO结构,对于音频流,内存块包含了WAVEFORMATEX或者PCMAVEFORMAT结构。你可以通过给AVIStreamReadFormat传递一个空buffer就可以获取buffer的大小。也可以通过AVIStreamFormatSize宏。
  可以通过AVIStreamRead函数来返回多媒体的数据。这个函数将数据复制到应用程序提供的内存中,对于视频流,这个函数返回图像祯,对于音频流,这个函数返回音频的sample数据。可以通过给AVIStreamRead传递一个NULL的buffer来获取需要的buffer的大小。也可以通过AVIStreamSampleSize宏来获取buffer的大小。
  有些AVI数据流句柄可能需要在启动数据流的前要做一下准备工作,此时,我们可以调用AVIStreamBeginStreaming函数来告知AVI数据流handle来申请分配它需要的一些资源。在完毕后,调用AVIStreamEndStreamming函数来释放资源。
2.3操作压缩的视频数据
  如果你要演示一祯或者几祯压缩视频图像时,你可以调用AVIStreamRead函数,将获取的数据传递给DrawDib函数来显示图像。这些函数可以显示压缩和未压缩的图像。
  AVIFile也提供了一个函数AVIStreamGetFrameOpen,来获取未压缩的视频祯,这个函数创建了内存来获取未压缩的数据。也可以通过AVIStreamGetFrame函数来解压缩一个单独的视频祯。这个函数可以解压缩某一祯图像,然后将数据以一个BIMAPINFOHEADER结构返回。当你调用完AVIStreamGetFrame函数后,要调用AVIStreamGetFrameClose函数释放上一个函数申请的资源。
2.4根据已存在的数据流创建文件
   创建一个包含多个数据流的文件的方法就是整合多个数据流,将其写入一个新文件。这些数据流可以是内存中的数据,也可以是存在于另一个文件中。
  我们可以用AVISave这个函数来build一个文件。这个函数可以创建一个文件,并且将指定的多个数据流按照指定的顺序写入文件,你也可以通过AVISaveV函数来创建一个新的文件,这个函数的功能和AVISave的功能一样,主要区别是AVISaveV采用的数据流数组,而AVISave是单个的数据流,多次保存。
  我们可以调用AVISaveOptions函数来显示一个对话框,可以让用户来选择压缩方式。
  我们可以在调用AVISave和AVISaveV函数时指定一个回调函数,用来显示avi文件的生成进度,可以让用户随时地取消生成avi文件。
  我们可以调用GetSaveFileNamePreview函数来显示保存的对话框让用户选择保存的文件名。
  通过AVIMakeFileFromStreams函数我们可以创建一个虚拟的文件句柄,其他的avi函数可以通过这个虚拟的文件句柄来操作文件中的数据流,操作完毕要记得调用AVIFileRelease释放。
2.5向文件写入一个数据流
 我们可以通过AVIFileCreateStream函数来在一个新文件或者已经存在的文件中创建一个数据流。这个函数根据AVISTREAMINFO结构定义了新的数据流,并为新的数据流创建一个接口,返回接口的指针。
  在写入新的数据前,一定要指定流的格式信息,通过AVIStreamSetFormat函数,当设置一个视频流的时候,一定要使用BIMAPINFO结构来设置,音频就用WAVEFORMAT。
  然后我们就可以通过AVIStreamWrite函数将我们的多媒体数据写入数据流了。这个函数将应用程序提供的内存数据复制到指定的流。缺省的avi handler将数据写入流的最后。
  如果你有其他额外的信息需要写入流,你可以调用AVIFileWriteData或者AVIStreamWriteData,
 最后记得在完成数据写入后,要调用AVIStreamRelease。
2.6数据流中的祯的位置
 寻找起始祯:
  可以通过AVIStreamStart函数来获取第一祯包含的sample number。也可以通过AVIStreamInfo函数来获取这个信息,这个函数的AVISTREAMINFO结构中包含了dwStart,可以通过AVIStreamStartTime宏来获取第一个sample。
  可以通过AVIStreamLength函数来获取流的长度。这个函数返回流中的sample的数目。也可以通过AVIStreamInfo函数来获取这些信息,可以通过AVIStreamLengthTime宏来获取流的长度,毫秒。
  在视频流中,一个sample对应着一祯图像,所以,有时这些sample中没有视频数据,如果你调用AVIStreamRead函数来数据,可能返回NULL,也可以通过AVIStreamFindSample通过指定FIND_ANY标志来查找指定的sample。
查找关键祯
通过AVIStreamFindSample函数查找符合要寻找的sample,然后可以通过下面的宏判断是否关键祯。
在time和sample间互相切换
 AVIStreamSampleToTime这个函数可以将smaple转换成毫秒。对于视频,这个值代表的是这个祯开始播放的时间,
 AVIStreamTimeToSample
2.7 创建临时的streams
 我们可以通过AVIStreamCreate函数在内存中创建一个临时数据流,
 我们可以从一个未压缩的数据流创建一个压缩的数据流,采用AVIMakeCompressedStream函数,
 当我们使用完 avistreamcreate或者avimakecompressedstream创建的数据流,要一定使用AVIStreamRelease函数来关闭数据流。
2.8对数据流进行编辑
 我们可以通过CreateEditableStream函数来创建一个用于编辑的数据流。这个函数初始化了编辑流的环境

#12


这些是我自己整理的,具体的你可以参考MSDN,我也是从上面摘抄下来的,因为最近在写avi文件

#13


呵呵,谢谢 aoosang(智慧的鱼) 同志啊,这个我收了,先研究下……

#14


http://hqtech.nease.net/Article/DS_AVIFileFormat.htm

#15


jx

#16


哦,我还要说两句啊,我处理的是是两个格式完全一样,没有声音的AVI文件

#17


PAVIFILE  pfile1, pfile2, pfile3;                                      
          AVIFILEINFO    pfi;                          
          PAVISTREAM pavi1, pavi2;
          AVISTREAMINFO    strhdr; 
          BITMAPINFOHEADER bi;           
          LONG             lStreamStart; 
          LONG             lStreamSize; 
          LPVOID           lpData1;  
          LPVOID           lpData2;  


 
           //initializes  the  AVIFile  library,同AVIFileExit()对应。  
           //Call  AVIFileInit()  before  using  any  other  AVIFile  functions      
           AVIFileInit();  
           AVIFileOpen(&pfile1, "a.avi",OF_READ  ¦OF_SHARE_DENY_NONE,NULL);    
            AVIFileOpen(&pfile2, "b.avi",OF_READ  ¦OF_SHARE_DENY_NONE,NULL);      
           AVIFileGetStream(pfile1,&pavi1,streamtypeVIDEO,0);       
           AVIFileGetStream(pfile2,&pavi2,streamtypeVIDEO,0);
           AVIFileOpen(&pfile3, "c.avi",OF_WRITE  ¦ OF_CREATE, NULL);PAVIFILE         pf; 
           AVIStreamFormatSize(pavi1, 0, &lStreamSize); 
 
          lStreamSize = sizeof(bi); 
          AVIStreamReadFormat(pavi1, 0, &bi, &lStreamSize); // Read format 
  
          AVIStreamInfo(pavi1, &strhdr, sizeof(strhdr)); 
 
    
  
          AVIFileCreateStream(pfile3, &pavi3, &strhdr); 
  
    // Set format of new stream using AVIStreamSetFormat. 
          AVIStreamSetFormat(pavi3, 0, &bi, sizeof(bi));  
    // Allocate memory for the bitmaps. 
   lStreamStart = AVIStreamStart(pavi1);
   lStreamSize = AVIStreamLength(pavi1);

    lpData1 = GlobalAllocPtr(GMEM_MOVEABLE, bi.biSizeImage*lStreamSize );    
        AVIStreamRead(pavi1, lStreamStart , lStreamSize , lpData1,bi.biSizeImage*lStreamSize ,
            NULL, NULL); 
             AVIStreamWrite(pavi3, lStreamStart , lStreamSize , lpData1,
            bi.biSizeImage*lStreamSize, AVIIF_KEYFRAME, NULL, NULL); 
int pos = AVIStreamEnd(pavi1);
  lStreamStart = AVIStreamStart(pavi2);
   lStreamSize = AVIStreamLength(pavi2);

    lpData2 = GlobalAllocPtr(GMEM_MOVEABLE, bi.biSizeImage*lStreamSize );    
        AVIStreamRead(pavi2, lStreamStart , lStreamSize , lpData1,bi.biSizeImage*lStreamSize ,
            NULL, NULL); 
             AVIStreamWrite(pavi3, pos, lStreamSize , lpData1,
            bi.biSizeImage*lStreamSize, AVIIF_KEYFRAME, NULL, NULL); 

 
    AVIStreamRelease(pavi1);   
 AVIStreamRelease(pavi2);
    AVIStreamRelease(pavi3); 
    AVIFileRelease(pfile1); 
    AVIFileRelease(pfile2); 
    AVIFileRelease(pfile3); 

           

#18


上面的程序运行不起来,老出错,所以再次顶上来了。希望大家再多多帮忙啊,谢谢

#19


可以吧,!

#20