急,请问如何获得AVI文件的长度

huifei99 2004-08-11 05:30:29
使用AviFileOpen创建AVI文件
然后分别使用AviFileCreateStream创建三个流(视,音,字幕)

然后通过三个Stream在写数据

我想知道在写的过程中某一个时刻AVI文件的大小
请问通过什么办法可以得到?
通过AVIFileInfo得到的Info中的dwLength是什么值啊?
MSDN好像说的不太清楚
...全文
194 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
huifei99 2004-08-13
  • 打赏
  • 举报
回复
问题是我的AVI文件还正在创建阿
因为是录像
所以文件一直被实时打开占用
每秒钟要写25祯视频和音频
我想知道的就是在录像过程中如何知道该文件的大小
huifei99 2004-08-12
  • 打赏
  • 举报
回复
?
谢了
不过不太明白
hiphop 2004-08-12
  • 打赏
  • 举报
回复
读AVI文件的头信息
里面都有详细的描述

AVI文件格式
AVI(Audio/Video Interleaved)文件是MS-Windows的视频文件,其文件扩展名为“.AVI”。它一般由三部分构成:信息区、数据区和索引区(可缺省),即两个LIST快和一个idx1块。这些区域,通常由一些子块组成,它们多用于为播放软件提供更为系统的数据信息;或为播放时进行快速数据定位及播放,并提供详细资料和识别手段(关于“区域”与“子块”具体包容关系请见图6)。
说明:本例由“四部分”构成,即在两个LIST块中间夹了个JUNK块。这个JUNK块纯属人为添加的自定义块,即在AVI文件中从未有对此块的定义。换句话说,我们也可以添加自己的决,只要遵循如下原则:在这三个标准块其中的某个后面,定义一个四字节的块识别码(不要与本文用到的识别码相同,最好字母用大写),紧跟一个长整数来表示你自定义的块的大小,随后便可以在定义的大小范围内写入你想表述的信息。同样,在这三个标准块的内部,也可以用上述方法添加自定义干块。
注:下文的说明内容部分取自华中理工大学出版的<>一文和<>的HELP文件。
以下就是作为例子的文件内容(数据D)及AVI文件标准结构图。


1.从(00000000-000007F3)为一个WindowsAVI文件的信息区部分。
它是文件的第一个LIST块。在它的内部记录着整个文件的系统构成,如告诉播放软件“我是一个AVI文件”;“在我的体内有几个数据流”;“每个数据流包含着什么数据类型——图像、声音或其他”;“如果是图像数据流,那么它的大小、颜色、压缩方式、播放速度等,等是怎样规定的”;“如果是声音数据流,那么它的压缩方式、播放效果等等又将有何规定”......在信息区中还有多个附属的LIST块,也就是我们前面提到的“子块”,它们用来记录每个数据流的全部信息。而这些附间LIST块与数据流之间保持着—一对应的关系,即
第一个附属LIST块对应于00号数据流;第二个附属LIST块对应于01号数据流......要想解释数据流,我们必须先了解AVI文件中数据块是什么。在AVI文件中,数据块是被放置在数据区中的一个有起始标志(由“数据流识别码”和“数据块存储方式识别码"组成,请参见对数据区部分的说明),并指明大小和数据内容的数据段.那么,数据流就是那些相互之间具有联系的同种数据类型的数据块集合.

00000000-00000003 多媒体文件识别码:RIFF
00000004-00000007 文件大小(10EDICh字节)-8字节
00000008-0000000B AVI文件识别码
0000000C-0000000F 第一个LIST块识别码
00000010-00000013 第一个LIST块的大小(168h字节)
00000014-00000017 hdrl部分识别码,以下数据记录着此文件的格式
00000018-0000001B hdrl部分所包含的avih块识别码,此模块记录着本文件的初始化信息
0000001C-0000001F avih块大小(38h字节)
00000020-00000023 每帧画面显示所维持多少个百万分之一秒,本例为1046Bh,即66667百万分之一秒,约0.07秒。所以在播放此文件时,你看到的画面约每秒15帧
huifei99 2004-08-12
  • 打赏
  • 举报
回复
如何能知道每个流的大小(字节数)?
而不是祯数呢
happydeer 2004-08-11
  • 打赏
  • 举报
回复
只要系统中有解码器,任何格式的文件适用。
happydeer 2004-08-11
  • 打赏
  • 举报
回复
告诉你一个最简单的方法,使用DirectShow中的一个com组件,很方便。你可以查询directx sdk文档中的IMediaDet接口。

IMediaDet::get_StreamLength获得文件的播放长度。


///////////////////////////////////////////////////////////////////////////////
Microsoft DirectX 9.0

IMediaDet Interface
The IMediaDet interface retrieves information about a media file, such as the number of streams, and the media type, duration, and frame rate of each stream. It also contains methods for retrieving individual frames from a video stream. The Media Detector (MediaDet) object exposes this interface.

To obtain information about a file using this interface, perform the following steps:

Create an instance of the MediaDet object by calling CoCreateInstance. The class ID is CLSID_MediaDet.
Call IMediaDet::put_Filename to specify the name of the source file.
Call IMediaDet::get_OutputStreams to obtain the number of output streams in the source.
Call IMediaDet::put_CurrentStream to specify a particular stream.
Call any of the following methods:
IMediaDet::get_FrameRate
IMediaDet::get_StreamLength
IMediaDet::get_StreamMediaType
IMediaDet::get_StreamType
huifei99 2004-08-11
  • 打赏
  • 举报
回复
谁帮帮我
真的很急啊

2,541

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧