Chinaunix首页 | 论坛 | 博客
  • 博客访问: 495051
  • 博文数量: 96
  • 博客积分: 6046
  • 博客等级: 准将
  • 技术积分: 908
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-07 22:40
文章分类

全部博文(96)

文章存档

2009年(12)

2008年(18)

2007年(45)

2006年(21)

我的朋友

分类: C/C++

2007-06-07 10:17:30

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


19
20
21
22


23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43


44

45
46
47
48
49
50

总共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函数,这个函数综合了AVIFileOpenAVIFileGetStream函数。

 如果你想操作文件中的多个数据流,你就要首先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传递一个NULLbuffer来获取需要的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函数来显示一个对话框,可以让用户来选择压缩方式。

  我们可以在调用AVISaveAVISaveV函数时指定一个回调函数,用来显示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,然后可以通过下面的宏判断是否关键祯。

timesample间互相切换

 AVIStreamSampleToTime这个函数可以将smaple转换成毫秒。对于视频,这个值代表的是这个祯开始播放的时间,

 AVIStreamTimeToSample

2.7 创建临时的streams

 我们可以通过AVIStreamCreate函数在内存中创建一个临时数据流,

 我们可以从一个未压缩的数据流创建一个压缩的数据流,采用AVIMakeCompressedStream函数,

 当我们使用完 avistreamcreate或者avimakecompressedstream创建的数据流,要一定使用AVIStreamRelease函数来关闭数据流。

2.8对数据流进行编辑

 我们可以通过CreateEditableStream函数来创建一个用于编辑的数据流。这个函数初始化了编辑流的环境,这些包含

 

阅读(3988) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~