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

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

2008-12-03 17:38:46

标签:WinForm C# libvlc.dll 休闲 vlc

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。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步。

参考网址:

1. [url]http://forum.videolan.org/viewtopic.php?f=14&t=47385&st=0&sk=t&sd=a&hilit=C%23+wrapper[/url]

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

 
 lbp0200、xc_shen、jiang421122
8人
了这篇文章

附件下载:
  Marx_libvlc_wrapper(2).zip
  MyOwnPlayer.rar

类别:VLC┆阅读(26800)┆评论(80) ┆ 返回博主首页返回博客首页

上一篇 windows平台下vlc编译之四:精简vlc 下一篇 windows平台下vlc编译之五:vlc-0.9.6的编译

时间: 2024-07-29 11:46:16

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

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

C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C#中使用这三个函数. [DllImport("Kernel32")] public static extern int GetProcAddress(int handle, String funcname); [DllImport("Kernel32")] public

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

请移步https://higoge.github.io/,所有下载资料在那个博客都能找到.谢谢. http://jeremiah.blog.51cto.com/ 2009-05-14补充:8. Activex的卸载:9. 让vlc自动安装Activex :10. 关于vlc的Activex的说明. vlc自带了ActiveX控件--axvlc.dll,在编译完vlc之后的activex文件夹下.ActiveX是个好东西,axvlc.dll可以随意放到任何位置,成功注册之后可以方便的应用在程序和网

C# 动态调用WebService

Reference from : http://blog.csdn.net/chuxiamuxiang/article/details/5731988 在C#程序中,若要调用WebService,一般是采用"添加Web引用"的方式来实现的.但如果此WebService的URL是在程序运行过程中才能获得的,那怎么办呢?那就必须是"动态"调用这个WebService了. 网上有不少关于这方面的例子,总结了一下,主要有两种:(1)每次都动态调用,(2)将WebServic

动态调用webservice

public static class WebserviceHelper { /// <summary> /// 动态调用WebService /// </summary> /// <param name="url">WebService地址</param> /// <param name="methodname">方法名(模块名)</param> /// <param name=&quo

[转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现

本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出错,似乎要重新绑定Webservice并重新编译后才能再次运行.我无意中通过百度搜索找了一个采用GET/POST/SOAP方式动态调用WebService的

动态调用WebService(C#) (非常实用)

前言 站在开发者的角度,WebService 技术确实是不再“时髦”.甚至很多人会说,我们不再用它.当然,为了使软件可以更简洁,更有层次,更易于实现缓存等机制,我是非常建议将 SOAP 转为 RESTful 架构风格的.但到目前为止,WebService 在一些Public Institution 中使用还是十分广泛的. 这里主要讨论一下关于WebService的调用问题.关于WebService 的调用分为静态调用和动态调用两种,外加直接Http请求方式 静态调用 静态调用的方式是通过“Add

C# 动态调用 WebService (转)

通常我们在程序中需要调用WebService时,都是通过"添加Web引用",让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名.参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制.如果哪一天发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译.在某些情况下,这可能是不能忍受的,我们需要动态调用WebService的能力.比如我们可以把Web服务的URL保存在配置文件中,

http请求POST和GET调用接口以及反射动态调用Webservices类

此代码是API.WebSrvices动态调用的类,做接口调用时很实用. Webservices动态调用使用反射的方式很大的缺点是效率低,若有更好的动态调用webservices方法,望各位仁兄不吝贴上代码. using System; using System.IO; using System.Net; using System.Text; using System.Web; using System.Collections.Generic; using System.CodeDom.Compi

记录:Web无引用无配置方式动态调用WCF服务

这几年一直用WebApi较多,最近项目中有个需求比较适合使用WCF,以前也用过JQuery直接调用Wcf的,但是说实话真的忘了… 所以这次解决完还是花几分钟记录一下 WCF服务端:宿主在现有Win服务中,在服务启动时添加代码 ,服务代码就不用写了,接口和实现按照契约实现即可 private ServiceHost serviceHost = null; //服务宿主 //启动WCF服务 if (serviceHost != null) { serviceHost.Close(); } servi