zoukankan      html  css  js  c++  java
  • 【Delphi】从内存(MemoryStream)使用WMP(WindowsMediaPlayer)控件播放视频音频(Play Video with WMP from MemoryStream)

    关键字: MemoryStream、WMP、WindowsMediaPlayer、Play 、Load、 Delphi、C++、C#、ActiveX控件

    作  者: CaiBirdy

    问  题:正常使用WindowsMediaPlayer控件的URL属性可以很方便播放音视频,但是在独立桌面软件中,这种方式的URL必须是一个本地文件,但是有些特殊应用中,对音视频文件加密保护,且要求只能播放,但不能拷贝,即使拷贝了也是无法播放的文件(因为文件被加密处理了),同时要求播放过程中不能在本地生成临时文件。

    这个问题对没有经验的开发者而言会很容易被难倒,因为要完全开发一个播放器去集成到应用中显得很不现实,而WindowsMediaPlayer又不提供从内存流播放的方法,在网上搜索资料又很少涉及这方面的,其实有一个很简单的方法去解决这个问题,那就是利用URL这个属性最原始的定义,URL是一个地址路径,不仅支持本地路径,也支持HTTP路径,因此可以实现一个简易的HTTP服务器来供WindowsMediaPlayer加载即可。

    而HTTP服务器的源码要比播放器的源码来得简单多,网上一搜就出来,而且更容易懂,也更容易集成开发,建议没有特殊要求的情况下使用Indy控件包中的TIdHTTPServer即可。

    以下是Delphi实现的代码

    该方法唯一的问题是,启动HTTP服务器时,会被系统或杀毒软件警告!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    var
      FMemoryStream: TStream;
       
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      IdHTTPServer1.Active := True;
      FMemoryStream:=TMemoryStream.Create;
      TMemoryStream(FMemoryStream).LoadFromFile(ExtractFilePath(ParamStr(0))+'sample.mp3');
    end;
       
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      IdHTTPServer1.Active := False;
      FMemoryStream.Free;
    end;
       
    procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
      if Pos('sample.mp3', AResponseInfo.Document)>0 then
      begin
        AResponseInfo.ContentStream := FMemoryStream;
        AResponseInfo.FreeContentStream := False;
      end;
    end;
       
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        WindowsMediaPlayer1.URL := 'http://127.0.0.1:80/sample.mp3';
    end;
     

    由于使用TMemoryStream不适合大文件,不然内存直接撑爆了,所以可以将视频文件加密缓存在其他地方(本地硬盘,或从服务器/数据库获取片段),再自己实现一个TStream来读取即可。

  • 相关阅读:
    javascript的自定义对象
    解决trim兼容性
    AJAX
    javascript中的默认对象
    js原始数据类型
    javascript的内置对象
    空判断啊
    javascript的继承
    html如何设置P的高度为零?
    asp.net 生成静态页 自动分页
  • 原文地址:https://www.cnblogs.com/caibirdy1985/p/4232945.html
Copyright © 2011-2022 走看看