DELPHI获取flash文件的影片时长,原始尺寸,帧数等信息

//转载,版权归原作者所有

DELPHI获取flash文件的影片时长,原始尺寸,帧数等信息

感谢“温柔刀客”的努力,找到一篇不错的Flash编程文章,也感谢文章的作者,解决了我一个困惑了很久的问题,呵呵~~~

unit uFlash;

interface

uses
   windows, SysUtils, Classes, Zlib;

type
   TBitWidth = Integer;
   TSWFRect = packed record
     Xmin: Integer;                                           // in twips
     Xmax: Integer;                                           // in twips
     Ymin: Integer;                                           // in twips
     Ymax: Integer;                                           // in twips
   end;

   TSWFColor = packed record
     R : Byte;
     G : Byte;
     B : Byte;
     RGB : string;
   end;

   TSWFHeader = packed record
     Signature: array[0..2] of char;
     Version: byte;
     FileLength: cardinal;
     FrameSize: TSWFRect;
     FrameRate: byte;
     FrameRateRemainder: byte;
     FrameCount: cardinal;
     BkColor : TSWFColor;
   end;

   TTagHandle   = record
     ID   : Integer;
     Length   : Integer;
     HandleLength   : Integer;
   end;
  
function GetSwfFileHeader(const FileName: string; var Header: TSWFHeader): boolean;

implementation

function ReadNBits(const Buffer; Position: longint; Count: TBitWidth): longint;
var
   I, B: longint;
begin
   Result := 0;
   B := 1 shl (Count - 1);
   for I := Position to Position + Count - 1 do
   begin
     if (PByteArray(@Buffer)^[I div 8] and (128 shr (I mod 8))) <> 0 then
       Result := Result or B;
     B := B shr 1;
   end;
end;

function ReadTagHandle(const Buffer; Position : Longint): TTagHandle;
var
   v : Smallint;
begin
   v :=   PSmallint(@PByteArray(@Buffer)^[Position])^;
   Result.ID :=   v shr 6;
   v :=   v shl 10;
   Result.Length :=   v shr 10;
   if Result.Length = $FFFFFF then
   begin
     //长tag
     Result.HandleLength :=   6;
     Result.Length :=   PInteger(@PByteArray(@Buffer)^[Position + 2])^;
   end
   else
     Result.HandleLength :=   2;
end;

function GetSwfFileHeader(const FileName: string; var Header: TSWFHeader): boolean;
const
   BuffSize = 64;
var
   Buffer: PByteArray;
   NBitsField: byte;
   Poz: longword;
   FileStream: TFileStream;
   MemStream: TMemoryStream;
   ZStream: TDecompressionStream;
   Tag : TTagHandle;
begin
   Result := False;
   if not FileExists(FileName) then
     Exit;
   FileStream := TFileStream.Create(FileName, fmOpenRead);
   try
     FileStream.Position := 0;
     if FileStream.Size > 22 then
     begin
       GetMem(Buffer, BuffSize);
       try
         FileStream.Read(Header, 8);
         if (Header.Signature = 'CWS') and (Header.Version >= 6) then
         begin
           Result := True;
           MemStream := TMemoryStream.Create;
           try
             MemStream.CopyFrom(FileStream, FileStream.Size - 8);
             MemStream.Position := 0;
             ZStream := TDecompressionStream.Create(MemStream);
             try
               ZStream.Read(Buffer^, BuffSize);
             finally
               ZStream.Free;
             end;
           finally
             MemStream.Free;
           end;
         end
         else
         begin
           FileStream.Read(Buffer^, BuffSize);
           Result := Header.Signature = 'FWS';
         end;

         if Result then
           with Header do
           begin
             Poz := 0;
             NBitsField := TBitWidth(ReadNBits(Buffer^, Poz, 5));
             Inc(Poz, 5);
             FrameSize.Xmin := Integer(ReadNBits(Buffer^, Poz, NBitsField));
             Inc(Poz, NBitsField);
             FrameSize.Xmax := Integer(ReadNBits(Buffer^, Poz, NBitsField));
             Inc(Poz, NBitsField);
             FrameSize.Ymin := Integer(ReadNBits(Buffer^, Poz, NBitsField));
             Inc(Poz, NBitsField);
             FrameSize.Ymax := Integer(ReadNBits(Buffer^, Poz, NBitsField));
             Inc(Poz, NBitsField);
             NBitsField := Poz mod 8;
             Poz := Poz div 8;
             if (NBitsField > 0) then
               Inc(Poz);
             FrameRateRemainder := Buffer^[Poz];              // 8.[8]
             FrameRate := Buffer^[Poz + 1];
             FrameCount := Buffer^[Poz + 2] or (Buffer^[Poz + 3] shl 8);
             Inc(Poz, 4);
             Tag :=   ReadTagHandle(Buffer^, poz);
             while Tag.ID <> 9 do
             begin
               Inc(Poz, Tag.Length + Tag.HandleLength);
               Tag :=   ReadTagHandle(Buffer^, Poz);
             end;
             BkColor.R := Buffer^[Poz + 2];
             BkColor.G := Buffer^[Poz + 3];
             BkColor.B := Buffer^[Poz + 4];
             BkColor.RGB :=   StringReplace(
                 Format('%2x%2x%2x', [BkColor.R, BkColor.G, BkColor.B]),
                 ' ', '0', [rfReplaceAll]); 
           end;

       finally
         FreeMem(Buffer);
       end;
     end;
   finally
     FileStream.Free;
   end;
end;

end.


=====================

一个运行实例:

procedure TForm1.Button4Click(Sender: TObject);
var
    Head: TSWFHeader;
    Xmin, Ymin, XMax,YMax:integer;
begin
    M.Clear;
    if not FIleExists(Edit1.Text) then exit;
    if not GetSwfFileHeader(Edit1.Text, Head)
        then SHowmessage('读取出错');

    //注意需要 div 20 才得到真正的像素大小
    //XMin:=Head.FrameSize.Xmin div 20;
    XMax:=Head.FrameSize.Xmax div 20;
    //YMin:=Head.FrameSize.Ymin div 20;
    YMax:=Head.FrameSize.Ymax div 20;
    //M.Lines.Add(inttostr(XMin));

    M.Lines.Add('当前影片的长是:'+inttostr(XMax));
    //M.Lines.Add(inttostr(YMin));
    M.Lines.Add('当前影片的宽是:'+inttostr(YMax));
end;


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字乡村和智慧农业的数字化转型是当前农业发展的新趋势,旨在通过应用数字技术,实现农业全流程的再造和全生命周期的管理服务。中国政府高度重视这一领域的发展,提出“数字中国”和“乡村振兴”战略,以提升国家治理能力,推动城乡融合发展。 数字乡村的建设面临乡村治理、基础设施、产业链条和公共服务等方面的问题,需要分阶段实施《数字乡村发展战略纲要》来解决。农业数字化转型的需求包括满足市民对优质农产品的需求、解决产销对接问题、形成优质优价机制、提高农业劳动力素质、打破信息孤岛、提高农业政策服务的精准度和有效性,以及解决农业融资难的问题。 数字乡村建设的关键在于构建“1+3+4+1”工程,即以新技术、新要素、新商业、新农民、新文化、新农村为核心,推进数据融合,强化农业大数据的汇集功能。数字农业大数据解决方案以农业数字底图和数据资源为基础,通过可视化监管,实现区域农业的全面数字化管理。 数字农业大数据架构基于大数据、区块链、GIS和物联网技术,构建农业大数据中心、农业物联网平台和农村综合服务指挥决策平台三大基础平台。农业大数据中心汇聚各类涉农信息资源和业务数据,支持大数据应用。信息采集系统覆盖市、县、乡、村多级,形成高效的农业大数据信息采集体系。 农业物联网平台包括环境监测系统、视频监控系统、预警预报系统和智能控制系统,通过收集和监测数据,实现对农业环境和生产过程的智能化管理。综合服务指挥决策平台利用数据分析和GIS技术,为农业决策提供支持。 数字乡村建设包括三大服务平台:治理服务平台、民生服务平台和产业服务平台。治理服务平台通过大数据和AI技术,实现乡村治理的数字化;民生服务平台利用互联网技术,提供各类民生服务;产业服务平台融合政企关系,支持农业产业发展。 数字乡村的应用场景广泛,包括农业生产过程、农产品流通、农业管理和农村社会服务。农业生产管理系统利用AIoT技术,实现农业生产的标准化和智能化。农产品智慧流通管理系统和溯源管理系统提高流通效率和产品追溯能力。智慧农业管理通过互联网+农业,提升农业管理的科学性和效率。农村社会服务则通过数字化手段,提高农村地区的公共服务水平。 总体而言,数字乡村和智慧农业的建设,不仅能够提升农业生产效率和管理水平,还能够促进农村地区的社会经济发展,实现城乡融合发展,是推动中国农业现代化的重要途径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值