关键字: 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;
 

【Delphi】从内存(MemoryStream)使用WMP(WindowsMediaPlayer)控件播放视频音频(Play Video with WMP from MemoryStream)的更多相关文章

  1. zw版【转发·台湾nvp系列Delphi例程】.NET调用HALCON COM控件内存释放模式

    zw版[转发·台湾nvp系列Delphi例程].NET调用HALCON COM控件内存释放模式 ------------------------------------方法一 :Imports Sys ...

  2. Delphi编程之好用的三方控件

    Delphi的强大与其庞大的组件库息息相关,目前的XE10.1版本已自带FastReport和GDI+等,下面我们来看一下几个非常强大且实用的组件库 一.DevExpress套件 Dev包含Grid. ...

  3. Delphi 7 里没有加载的控件

    在原来版本如D5.D6中使用的控件如Quickrep,FastNet等,在D7中仍然是保留的.只是Delphi没有将他们默认的安装到组件面版中来.这些控件包全部保存在Delphi目录的bin下,文件扩 ...

  4. Activex WindowsMediaPlayer控件主要方法属性

    属性/方法名: 说明:[基本属性] URL:String; 指定媒体位置,本机或网络地址 uiMode:String; 播放器界面模式,可为Full, Mini, None, Invisible pl ...

  5. C# Winform WindowsMediaPlayer控件

    要做一个视频无缝切换的程序,所谓无缝就是在一个视频结束时立即开始另一个视频,中间不要有切换的黑屏 实现思路是放两个wmp播放控件,其中每个时刻只有一个在播放,另外一个处于暂停状态,并隐藏 当一个视频播 ...

  6. delphi中响应鼠标进入或离开控件的方法

    Delphi没有MouseEnter与MouseLeave的事件,网上说可以响应CM_MOUSEENTER和CM_MOUSELEAVE消息来实现.这两个消息是VCL自己定义的消息,看了Delphi的C ...

  7. C# Winform开发程序调用VLC播放器控件播放视频.

    VLC是个好东西,支持的格式多,还无广告,关键还有调用它的播放控件不用安装. 开个文章记录下调用这个控件的流水账,以便以后需要的时候查阅 创建工程 首先新建一个Winform工程. 这里姑且叫做VLC ...

  8. 使用WebBrowser控件播放Flash网页相关问题解决方法(转)

    就是写一个类继承WebBrower控件,重写 protected   override   void   WndProc(ref   System.Windows.Forms.Message   m) ...

  9. WindowsMediaPlayer控件批量添加文件至播放列表

    思路: 1.读取批定路径的目录文件. 2.用List存放. 3.循环List列表添加到播放列表. public void VidieoPlay() { //WindowsMediaPlayer1.ui ...

随机推荐

  1. spring的框架集,简化的编程模型

    spring batch spring intergration spring ws spring jms spring-mvc -> spring-rest resthate z

  2. 使用csc命令进行编译

    ①如果csc不是内外部变量的情况下需要在计算机高级系统设置的环境变量里面下面的Path中将值的后面用分号隔开增加.net framework 4.0的文件路径 ②重新以“管理员身份运行cmd” ③将路 ...

  3. Unity项目在亚马逊KindleFire设备上旋转不正确的解决方案

    前提:      在亚马逊设备上,总部要求发布的版本必须使用LandscapeLeft方向.按照经验,在UnityPlayerSettings中设置Orientation即可.   问题表现:     ...

  4. THE ONE THING PEOPLE WILL MASSIVELY OVERPAY FOR (有一个东西人们是愿意出高价购买的)

    THE ONE THING PEOPLE WILL MASSIVELY OVERPAY FOR有一个东西人们是愿意出高价购买的 by GARY VAYNERCHUK 点此直达湾区日报简评 I don' ...

  5. [AFUI]App Framework Plugins

    ---------------------------------------------------------------------------------------------------- ...

  6. 【PL/SQL】异常处理:

    如果在PLSQL块中没有做异常处理,在执行PLSQL块时,出现异常,会传递到调用环境,导致程序运行出错! SCOTT@ prod> declare v_ename emp.ename%type; ...

  7. MySQL:MySQL和SQL Server的区别

    导读:接下来的网上商城的项目,需要用到MySQL数据库了.这个对于我来说,是一个新接触的东西,按照惯例,在刚开始学习一个东西的时候,先从宏观上去了解它.本篇博客,先介绍SQL Server的基本内容, ...

  8. js 打开PDF

    用插件打开PDF的一个超连接 但是谷歌了很久 ,发现了一个很好的方法 就是借google 来打开一个PDF ,而不下载PDF: _yourID.setAttribute('onclick'," ...

  9. iptable软路由

    http://xstarcd.github.io/wiki/Linux/iptables_forward_internetshare.html # 默认丢弃转发,所有内网流量不能访问外网卡 iptab ...

  10. 转载 《AngularJS》5个实例详解Directive(指令)机制

    <AngularJS>5个实例详解Directive(指令)机制 大漠穷秋 本文整理并扩展了<AngularJS>这本书第六章里面的内容,此书近期即将由电子工业出版社出版,敬请 ...