引用
最初由 maomao333 发布
很不错的统计软件,支持!
请教一下strnghrs:
1.从AVI文件的"idx1"能读到每个包长时间?
2.RMVB中的每个包(package)的一般大小是多少,对应的时间戳所指时间段有多长?如果包长和时间都比较大,所计算的误差是不是大?
第一个问题比较好回答:idx1只能读到包长,没有时间,时间是按序号算出来的,为了保证精度,必须采用浮点数算。
第二个问题不是三言两语说得清。
对于RM文件来说,由于一开始就是针对网络播放,因此在RM文件结构中没有通常多媒体文件的帧(frame)概念,只有与TCP/IP对应的包(packet)概念,就象在《RealSystem G2 SDK Documentation - Chapter 5: File Format Plug-In》一文开始处的说明:
The first step in integrating your datatype into RealSystem is building a file format plug-in that converts your datatype into a stream of RealSystem packets. RealServer uses your plug-in to stream your datatype directly from its native file format. The RealSystem client then assembles the packets and displays the data through a rendering plug-in.
熟悉TCP/IP的人都知道,在网络传输时,太大的包会使传输变得不可靠,一般公认在Internet上传输的包长不宜超过1024字节,因此在该文中也有这样的说明:
A file format plug-in should generally create packets of 430 to 500 bytes for the opaque data. Staying under 500 bytes decreases the likelihood of packet fragmentation.
不过这个针对的是网络播放的情况,现在很多片子针对的都是LAN或本地观看,这种情况下可以适当增加包的长度——增加包长、减少包数,理论上可以减小最终生成的RM文件长度,但是一旦丢包,损失相对小包要大。因此正常情况下,包长都小于帧数据长度,即一帧(尤其是关键帧)可能需要多个包才能表示,但是一个包中通常不会包含多于两帧的数据。这样可以减少丢包造成的损失,也便于定位(seek)。
从我测试的片子来看,即使压片时选择针对LAN环境,一般包长最长的也就1000字节多一点,通常只有几十、几百个字节,小于一帧的数据量;至于包的时间戳差距,CBR相对稳定一些,一般几十毫秒,VBR变动比较大,最小1毫秒,最大到100多一点,平常几十毫秒。在RM文件的Media Properties Header段中,对每个流的最大包长、平均包长都有描述,用RMVB_Analyse可以看到,在以后版本的BitrateCurve中说不定也可以看到。
在我看来,BitrateCurve这种按照包的时间戳数包、计算码率的方法,对于那些跨秒的包来说,误差肯定是有的,但是影响不大。
想要尽一步减少误差,只能去研究RMVB的解码器,找到将包解码成帧的办法,技术难度要比现在数包的方法难很多,谁愿干谁干,至少我自己是不会干的。