vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll

2008-12-03 17:38:46

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeremiah.blog.51cto.com/539865/116981
    vlc-0.9.4提供的libvlc.dll是可以动态调用的,Jeremiah这一篇博客就介绍下如何用C#和WinForm框架调用libvlc.dll作个简易播放器。
 
    1. vs2005新建工程,将vlc-0.9.4的libvlc.dll,libvlccore.dll,plugins目录全部拷贝到工程目录下面\bin\Debug中。
 
    2. 创建异常结构体
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace MyOwnPlayer 

        //异常结构体 
        public struct ExceptionStruct 
        { 
                private int raised; 
                private int code; 
                private string message; 
        } 
 
        class MediaException 
        { 
        } 
}
 
    3. CoreHandle和Core类
using System; 
using System.Runtime.InteropServices; 
 
namespace MyOwnPlayer 

        class CoreHandle : SafeHandle 
        { 
                //构造方法 
                public CoreHandle() 
                        : base(IntPtr.Zero, true) 
                { 
                } 
 
                //重写的方法 
                public override bool IsInvalid 
                { 
                        get { return handle == IntPtr.Zero; } 
                } 
 
                protected override bool ReleaseHandle() 
                { 
                        if (!IsInvalid) 
                        { 
                                libvlc_release(this); 
                                handle = IntPtr.Zero; 
                        } 
                        return true; 
                } 
 
                protected override void Dispose(bool disposing) 
                { 
                        ReleaseHandle(); 
                        base.Dispose(disposing); 
                } 
 
                //Dll动态导入 
                [DllImport("libvlc")] 
                private static extern void libvlc_release(CoreHandle coreHandle); 
        } 
 
using System; 
using System.Runtime.InteropServices; 
 
namespace MyOwnPlayer 

        class Core 
        { 
                //coreHandle字段和属性 
                private CoreHandle coreHandle; 
                public CoreHandle CoreHandle 
                { 
                        get { return coreHandle; } 
                } 
                 
                //构造方法 
                public Core(string[] argv, ref ExceptionStruct ex) 
                { 
                        coreHandle = libvlc_new(argv.Length, argv, ref ex); 
                } 
 
                //Dll动态导入 
                [DllImport("libvlc")] 
                private static extern CoreHandle libvlc_new(int argc, string[] args, ref ExceptionStruct ex); 
        } 
 
    3. MediaHandle和Media类,注意里面的非英文路径处理方法。
using System; 
using System.Runtime.InteropServices; 
 
namespace MyOwnPlayer 

        class MediaHandle : SafeHandle 
        { 
                //构造方法 
                public MediaHandle() 
                        : base(IntPtr.Zero, true) 
                { 
                } 
 
                //重写的方法 
                public override bool IsInvalid 
                { 
                        get { return handle == IntPtr.Zero; } 
                } 
 
                protected override bool ReleaseHandle() 
                { 
                        if (!IsInvalid) 
                        { 
                                libvlc_media_release(this); 
                                handle = IntPtr.Zero; 
                        } 
                        return true; 
                } 
 
                protected override void Dispose(bool disposing) 
                { 
                        ReleaseHandle(); 
                        base.Dispose(disposing); 
                } 
 
                //Dll动态导入 
                [DllImport("libvlc")] 
                private static extern void libvlc_media_release(MediaHandle mediaHandle);                 
        } 
 
using System; 
using System.Text; 
using System.Runtime.InteropServices; 
 
namespace MyOwnPlayer 

        class Media 
        { 
                //mediaHandle字段和属性 
                private MediaHandle mediaHandle; 
                public MediaHandle MediaHandle 
                { 
                        get { return mediaHandle; } 
                } 
 
                //构造方法                
                public Media(CoreHandle coreHandle, String filename, ref ExceptionStruct ex) 
                { 
                        //c#为UTF-16编码, libvlc.dll为UTF-8编码, 需要转换. 
                        UTF8Encoding utf8 = new UTF8Encoding(); 
                        mediaHandle = libvlc_media_new(coreHandle, utf8.GetBytes(filename), ref ex); 
                } 
                 
                //Dll动态导入 
                [DllImport("libvlc")] 
                private static extern MediaHandle libvlc_media_new 
                        (CoreHandle coreHandle, [MarshalAs(UnmanagedType.LPArray)] byte[] link, refExceptionStruct ex); 
                } 
 
    5. MediaPlayerHandle和MediaPlayer类
using System; 
using System.Runtime.InteropServices; 
 
namespace MyOwnPlayer 

        class MediaPlayerHandle : SafeHandle 
        { 
                //构造方法 
                public MediaPlayerHandle() 
                        : base(IntPtr.Zero, true) 
                { 
                } 
 
                //重写的方法 
                public override bool IsInvalid 
                { 
                        get { return handle == IntPtr.Zero; } 
                } 
 
                protected override bool ReleaseHandle() 
                { 
                        if (!IsInvalid) 
                        { 
                                libvlc_media_player_release(this);                                handle = IntPtr.Zero; 
                        } 
                        return true; 
                } 
 
                protected override void Dispose(bool disposing) 
                { 
                        ReleaseHandle(); 
                        base.Dispose(disposing); 
                } 
 
                //Dll动态导入 
                [DllImport("libvlc")] 
                private static extern void libvlc_media_player_release(MediaPlayerHandle mediaPlayerHandle); 
        } 
 
using System; 
using System.Runtime.InteropServices; 
 
namespace MyOwnPlayer 

        class MediaPlayer 
        { 
                //mediaPlayerHandle字段和属性 
                private MediaPlayerHandle mediaPlayerHandle; 
                public MediaPlayerHandle MediaPlayerHandle 
                { 
                        get { return mediaPlayerHandle; } 
                } 
 
                //构造方法 
                public MediaPlayer(MediaHandle mediaHandle, ref ExceptionStruct ex) 
                { 
                        mediaPlayerHandle = libvlc_media_player_new_from_media(mediaHandle, ref ex); 
                } 
 
                //设置父窗口 
                public void VedioSetParent(CoreHandle coreHandle, IntPtr hDT, ref ExceptionStruct ex) 
                { 
                        libvlc_video_set_parent(coreHandle, hDT, ref ex); 
                } 
 
                //播放 
                public void Play(ref ExceptionStruct ex) 
                { 
                        libvlc_media_player_play(mediaPlayerHandle, ref ex); 
                } 
 
                //停止 
                public void Stop(ref ExceptionStruct ex) 
                { 
                        libvlc_media_player_stop(mediaPlayerHandle, ref ex); 
                } 
 
                //Dll动态导入 
                [DllImport("libvlc")] 
                private static extern MediaPlayerHandle libvlc_media_player_new_from_media(MediaHandle libvlc_media_handle, ref ExceptionStruct ex); 
 
                [DllImport("libvlc")] 
                private static extern void libvlc_video_set_parent(CoreHandle coreHandle, IntPtr hDT, refExceptionStruct ex); 
 
                [DllImport("libvlc")] 
                private static extern void libvlc_media_player_play(MediaPlayerHandle mediaPlayerHandle, ref ExceptionStruct ex); 
 
                [DllImport("libvlc")] 
                private static extern void libvlc_media_player_stop(MediaPlayerHandle mediaPlayerHandle, ref ExceptionStruct ex); 
        } 
 
    6. 基本工作做好了。下一步建立一个Form,里面画一个Panel(播放容器),画一个Textbox(播放地址),画一个Button(播放按钮),Button的点击事件为:
private void button1_Click(object sender, EventArgs e) 

        //要播放的文件的uri 
        string uri = this.textBox1.Text; 

         //进行播放的控件的句柄 
        IntPtr hdl = this.panel1.Handle; 

         //播放参数 
        string[] argv = new string[] { "-I", "--ignore-config" }; 

         //vlc对象的创建 
        ExceptionStruct ex = new ExceptionStruct(); 
        Core core = new Core(argv, ref ex); 
        Media media = new Media(core.CoreHandle, uri, ref ex); 
        MediaPlayer player = new MediaPlayer(media.MediaHandle, ref ex); 

         //垃圾回收 
        GC.Collect(); 

         //播放 
        player.VedioSetParent(core.CoreHandle, hdl, ref ex); 
        player.Play(ref ex); 

         //继续回收垃圾等相关操作 
        GC.Collect(); 
        GC.WaitForPendingFinalizers(); 
}
 
    7. 基本的播放功能就是这样实现的。其他接口请参考源码下面的\include\vlc\libvlc.h文件,里面有比较详细的对外接口的说明。
 
    8. 以上代码已经发送到附件中(MyOwnPlayer.rar),参考网址的楼主写的代码也在附件中(Marx_libvlc_wrapper(2).zip)。调试附件请注意第1步。
   
参考网址:

本文出自 “海狗哥的流媒体空间” 博客,请务必保留此出处http://jeremiah.blog.51cto.com/539865/116981

 
 lbp0200、xc_shen、jiang421122
8人
了这篇文章
类别:VLC┆阅读(26800)┆评论(80) ┆ 返回博主首页返回博客首页

vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll【转】的更多相关文章

  1. C#动态调用C++编写的DLL函数

    C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...

  2. 网页IE轻松调用VLC播放器实现监控(组件+方法大全)【转】

    公司突发奇想,要把刚买回来的网络监控机用自己内部网站在线监控. 作为网站的开发员,我接下了这个任务. 网络上有很多资料参与,但是都不全都不尽人意,最后经过多次的不同关键字的查找和测试,总算让我成功了. ...

  3. vlc的应用之二:vlc的ActiveX及cab

    请移步https://higoge.github.io/,所有下载资料在那个博客都能找到.谢谢. http://jeremiah.blog.51cto.com/ 2009-05-14补充:8. Act ...

  4. 动态调用WebService

    WebService内容 using Microsoft.CSharp;using System;using System.CodeDom;using System.CodeDom.Compiler; ...

  5. c# 动态调用WCF方法笔记!

    //动态调用wcf方法 string url = "http://localhost:54379/ServiceWCF.svc"; IDoubleService proxy = W ...

  6. C#动态调用WCF接口,两种方式任你选。

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

  7. 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

  8. C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用

    1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图 ...

  9. Delphi DLL的创建、静态及动态调用

    转载:http://blog.csdn.net/welcome000yy/article/details/7905463 结合这篇博客:http://www.cnblogs.com/xumenger/ ...

随机推荐

  1. hdu 4163 Stock Prices 花式排序

    Stock Prices Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  2. POJ 2356 Find a multiple 抽屉原理

    从POJ 2356来体会抽屉原理的妙用= =! 题意: 给你一个n,然后给你n个数,让你输出一个数或者多个数,让这些数的和能够组成n: 先输出一个数,代表有多少个数的和,然后再输出这些数: 题解: 首 ...

  3. numpy中的random函数

    1:rand rand(d0, d1, ..., dn)    Random values in a given shape.    Create an array of the given shap ...

  4. 几张图理解Roll, Pitch, Yaw的含义

    Roll:翻滚    Pitch:俯仰    Yaw:偏航 有时候不知道它到底绕着哪个轴旋转得到的角,一个比较容易的记法是根据字母的排列顺序PRY分别对应XYZ轴进行旋转得到的角,即: Pitch是绕 ...

  5. JavaScript操作DOM(动态表格处理)

    <html> <title>动态处理表格数据</title> <head> <script type="text/javascript& ...

  6. 【原】Order属性决定了不同切面类中通知执行的先后顺序

    [障碍再现] MyBatis配置多数据源时,数据源切换失败. [原因分析]    自定义切面和Spring自带事务切面“即<aop:advisor>”执行的先后顺序导致数据源不能切换成功. ...

  7. 74HC245 74HCT245 74LV245 74LVC245 74LVC4245A 74LVC8T245 74LVC16T245 74ALVC164245

    74HC245/74HCT245 The 74HC245; 74HCT245 is a high-speed Si-gate CMOS device and is pin compatible wit ...

  8. IE中Ext的comboBox跑到页面左上角

    { xtype:'combo', width:100, //id:'exTypeCom', name:'exType', hiddenName:'exType', displayField:'text ...

  9. 【idea】idea重新打包依赖了父级项目的子级项目,父级项目代码改变,但是子级项目打包依旧是老的代码 问题解决

    最简单的方法: 就是单独打包父级项目,然后替换本地maven仓库中的父级项目的jar,然后重新打包子级项目,就可以了.

  10. Tomcat 下 Memcached 集群与 Terracotta 集群比较

    总结:Terracotta 集群配置要比Memcached 集群简单,但Terracotta 集群启动的速度要比Memcached 集群慢,性能Terracotta 集群要比Memcached 集群好 ...