获取Flash动画文件SWF的图像帧宽度、高度和Flash播放速率

本文探讨了如何分析Flash动画文件SWF的头部信息,以获取其图像帧的宽度、高度和播放速率。内容涉及SWF文件的标识符、版本号、尺寸控制码以及解压缩细节,适合对Flash播放器开发感兴趣的读者。
摘要由CSDN通过智能技术生成

    前不久,研究了Flash动画文件SWF的数据结构,喜欢编写Flash播放器的朋友可以借鉴。SWF文件开头三个字节为“FWS”(表示未压缩过),或者为“CWS”(表示从第9个字节起的数据用Zlib压缩过)。第4个字节为Flash的版本号,5-8字节为SWF源文件字节大小(压缩前的),第9个字节为Flash的宽度与高度控制码,控制码的不同,后面存储宽度与高度的数据区所占的字节长度也不一样。程序如下(zlibwapi.dll可以到网上去下载一个):

'类文件:Getswffilesize.cls
Option Explicit
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Declare Function compressAPI Lib "zlibwapi.dll" Alias "compress" (ByRef dest As Any, ByRef destLen As Long, ByRef Source As Any, ByVal sourceLen As Long) As Long
Private Declare Function compressBound Lib "zlibwapi.dll" (ByVal sourceLen As Long) As Long
Private Declare Function uncompressAPI Lib "zlibwapi.dll" Alias "uncompress" (ByRef dest As Any, ByRef destLen As Long, ByRef Source As Any, ByVal sourceLen As Long) As Long
Private Declare Function adler32 Lib "zlibwapi.dll" (ByVal adler As Long, ByRef buf As Any, ByVal length As Long) As Long
Private Declare Function crc32 Lib "zlibwapi.dll" (ByVal crc As Long, ByRef buf As Any, ByVal length As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
Private Const Z_OK As Long = &H0&
Private Const Z_ERROR As Long = -&H1&
Private Const Z_BUF_ERROR As Long = -&H5&

'规定字符串长度为2
Private Function Definestrlen(ByVal s As String) As String
    If Len(s) < 2 Then
       s = "0" & s
    Else
       s = s
    End If
    Definestrlen = s
End Function

'取得Flash动画文件SWF帧的分辨率大小、播放速率大小
Public Function GetFlashFileSize(ByVal SWFfile As String, ByRef SWFWidth As Long, ByRef SWFHeight As Long, ByRef SWFPlayRate As Double) As Long
    Dim FNum As Long, Temp As String, i As Long
    Dim refBuffer() As Byte, destBuffer() As Byte, origBytes() As Byte
    Dim origSize As Long '源文件字节大小
    Dim FlashW As Long, FlashH As Long 'Flash宽度,高度
    Dim Flashrate As Double 'Flash播放速率
    Dim OutCRC As Long 'CRC32校验
        
    If Not fileExist(SWFfile) Then Exit Function  '文件不存在则退出
    
    '将长文件名转换成短文件名
    Temp = String(LenB(SWFfile), Chr(0))
    GetShortPathName SWFfile, Temp, Len(Temp)
    Temp = Left(Temp, InStr(Temp, Chr(0)) - 1)
    
    FNum = FreeFile()
    Open Temp For Binary Access Read Lock Write As #FNum
    ReDim refBuffer(0 To (LOF(FNum) - 1)) As Byte
    ReDim destBuffer(0 To UBound(refBuffer) - 8)
    Get #FNum, , refBuffer() '取得文件所有内容
    Get #FNum, 9, destBuffer() '取得压缩字节流(文件头为CWS)
    Close #FNum
    
    If Hex$(refBuffer(0)) = "46" And Hex$(refBuffer(1)) = "57" And Hex$(refBuffer(2)) = "53" Then
       '文件头为FWS
       Debug.Print "文件头为FWS"
       Temp = ""
       Select Case Hex$(refBuffer(8))
           Case "50"
                For i = 9 To 13
                    Temp = Temp & Definestrlen(Hex$(refBuffer(i)))
                    'Hex$(refBuffer(9)) & Hex$(refBuffer(10)) & Hex$(refBuffer(11)) & Hex$(refBuffer(12)) & Hex$(refBuffer(13))
                Next
                FlashW = CLng("&H" & Definestrlen(Hex$(refBuffer(9))) & Definestrlen(Hex$(refBuffer(10)))) / 10
                FlashH = CLng("&H" & Mid$(Temp, 6, 4)) / 10
                Flashrate =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值