WinCE6.0下多媒体播放、flash播放需要获得视频源文件的播放时长,针对嵌入浏览器的Flash控件,如何获得flash文件的播放时长,参考信息!
(转 .....................................)
以一个实际的SWF文件头为例: 46 57 53 05 B4 66 07 00 70 00 0F A0 00 00 BB 80 00 0C 9F 03 字节 1-3 (46 57 53): SWF文件头标志,FWS表示未压缩,CWS表示压缩的SWF文件,需要从第9个字节起用ZLib解压 字节 4 (05): Flash文件的版本,这里表明它是用Flash5生成的 字节 5-8 (B4 66 07 00):一个Integer表示文件的长度,低在前,高在后,这里是0766B4 = 485044字节,这里应该等于未压缩的SWF文件实际大小或压缩过的SWF解压后的长度+文件头(8字节) 字节 9 - 。。。: SWF显示区域,(左上角坐标,右下角坐标),用下面的方法计算得到:第9字节前5位(70 shr 3 = 14),以后的字节以14位进行分割,所需位数为 14*4+5 = 61,需要 8 个字节来表示,那么: 70 00 0F A0 00 00 BB 80 01110 00000000000 00001111 10100000 00000000 0000000 010111011 10000000 01110 00000000000000 01111101000000 00000000000000 01011101110000 000 14 0 8000 0 6000 因为Flash的坐标是TWIP格式的,需要除以20的,所以实际为(0,400,0,300) 接下来的两字节 (00 0C):表示帧速率,前一字节表示小数位,后一字节表示整数位,不过一般极少有小数位的帧率,所以一般我们只计整数就可以了,这里 C = 12,即每秒12帧再接下来的两字节 (9F 03):表示总帧数,WORD类型,9F=927帧,与ShockwaveFlash.TotalFrames 得到的数值是一样的。 ................. 以上是我搜索的swf文件头的结构资料,例子中400*300的尺寸是如何得到的我看得稀里糊涂,哪位可以具体说明一下用VB如何实现? zlib中不是有个叫umcompress的导出函数,它可以从字节数组解压到字节数组 文件头"FWS"和"CWS"有什么区别? FWS和CWS是flash的swf影片标志。 CWS是在Flash6及以后版本中,发布影片时选中了“压缩影片”这一项,才有的。 flash文件头结构详细介绍: 用ultraedit打开swf文件,可以看出一个典型的flash文件的文件头结构如下: 46 57 53 07 FC DC 14 00 78 00 05 5F 00 00 0F A0 00 00 0C B7 0C 43 02 00 00 00 第1、2、3字节是flash文件的标志,46、57、53分别代表字符FWS,如果是压缩过的Flash,则是43、57、53,即CWS,压缩过的Flash文件从第9个字节起是用ZLib压缩过的; 第4字节是版本号,07即flash7; 第5、6、7、8字节是flash文件的大小,FC DC 14 00按高低位重新排序为00 14 DC FC,转换为十进制为1367292,单位为字节; 从第9字节开始是flash的尺寸,即舞台的宽度和高度(用左下角和右上角的坐标来表示)。其中第9字节是一个控制码,根据这个控制码的不同,后面标识尺 寸所占用的字节数也不同。其计算过程说来比较麻烦,但由于受flash尺寸的限制,控制码只有固定的8种情况,所以计算方法可以简化为: 控制码 尺寸数据举例 所代表尺寸(宽*高) 50 * * * * * * * * 18×18 0 0 B 4 0 0 0 B 4 0 58 # # # # * * * * 36×18 0 0 5 A 0 0 0 0 B 4 0 0 60 * * * * * * * * 100×48 0 0 3 E 8 0 0 0 1 E 0 0 68 # # # # * * * * 160×100 0 0 1 9 0 0 0 0 0 3 E 8 0 0 70 * * * * * * * * 400×320 0 0 0 F A 0 0 0 0 0 C 8 0 0 78 # # # # * * * * 550×400 0 0 0 5 5 F 0 0 0 0 0 F A 0 0 0 80 * * * * * * * * 1600×1200 0 0 0 3 E 8 0 0 0 0 0 2 E E 0 0 88 # # # # # # * * * * 2880×2880 0 0 0 1 C 2 0 0 0 0 0 0 7 0 8 0 0 0 说明:每个*或#(占半个字节)对应一个有效数据,前面几个连续的*或#对应的数据记录了高度值,后面几个连续的*或#对应的数据记录了宽度值。*所对应 十六进制数据转为十进制时除以10,#则除以40。上例中控制码为78,就用8字节来存放尺寸值,最终可得到其尺寸为550×400。 (由于表示flash尺寸的数据在swf文件中字节数并不相同,所以下面的字节数只是相对的。) 第18、19字节为flash的祯速,此处为000C,即12祯/秒; 第20、21字节为flash总的祯数,计算方法与flash文件大小的计算方法相同; 第22、23、24字节为flash的背景颜色,分别是红、绿、蓝值。 网上可以查得到的关于Flash文件头的信息大概就这么多,以下是我在实践中获取的经验: 如果制作flash时只使用了文字、形状等这些基本内置元素,那么在导出时无论是否选择了压缩,生成的swf文件都是未压缩的,其文件头符合上述结构;一 旦导入了图片、swf等外部元素,甚至只是使用了如button这样的flash集成的组件,而且在导出时选择了压缩,那么生成的swf文件才是真正压缩 的,此时文件头的前8位还符合常规,但从第9位开始就是用ZLib压缩过的。 举个例子: 43 57 53 07 6F BE 0C 00 78 9C 9C BB 67 54 53 DB F7 36 BA 43 42 09 BD 04 04 0C 10 20 12 82 8A 94 A0 09 35 F4 04 08 1D 45 44 A5 89 84 E3 51 8A 4A 。。。。。。。。。。。。。。。。。。。。。。。。 前8个字节可以按照常规获得Flash文件标志CWS、Flash版本7.0、文件大小835183字节这3个信息,从第9个字节开始必须先解压缩再按照 常规来分析。ZLib解压缩时必须传入精确的未压缩时的数据大小(很多情况下压缩数据的头4个字节就是该数值),但是在flash文件中该数值要从已得到 的Flash文件大小进行计算得到。比如该例中的文件大小835183字节,这个大小是未压缩前的Flash文件的精确尺寸,即包括完整的文件头和数据区 的大小,所以该数值减去8(Flash文件标志、版本号、文件大小所占用的字节数),就是ZLib压缩过的数据解压后的大小。
(责任编辑:admin) |