博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll【转】
阅读量:6420 次
发布时间:2019-06-23

本文共 5791 字,大约阅读时间需要 19 分钟。

 vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll
2008-12-03 17:38:46
标签:        
原创作品,允许转载,转载时请务必以超链接形式标明文章   、作者信息和本声明。否则将追究法律责任。
    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. 

本文出自 “” 博客,请务必保留此出处

分享至  
 lbp0200、xc_shen、jiang421122
8人
了这篇文章
附件下载:
  
  
类别: ┆阅读(
26800)┆评论(80) ┆ ┆
上一篇   下一篇 

转载于:https://www.cnblogs.com/fx2008/p/4315558.html

你可能感兴趣的文章
iOS宏(自己使用,持续更新)
查看>>
手把手玩转win8开发系列课程(3)
查看>>
NGINX引入线程池 性能提升9倍
查看>>
《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件
查看>>
linux下mongodb定时备份指定的集合
查看>>
SMP架构多线程程序的一种性能衰退现象—False Sharing
查看>>
oVirt JBAS server start failed, ajp proxy cann't server correct. ovirt-engine URL cann't open
查看>>
CDP WebConsole上线公告
查看>>
ubuntu下安装摄像头应用程序xawtv
查看>>
GFS2,GFS,EXT2,EXT3 SEQ-write performance compare
查看>>
PostgreSQL 如何比较两个表的定义是否一致
查看>>
PHPCMS2008利用EXP
查看>>
扩展android-volley来开发Android restful client
查看>>
Linux Mint下Kindle Fire调试android程序
查看>>
自定义Background
查看>>
git笔记
查看>>
Android开源中国客户端学习 配置文件读写 以及其他一些工具类 <13>
查看>>
国外的opencv识别文档
查看>>
java获取指定字符串的下一个
查看>>
多行数据提交到Struts的ActionForm的List属性中
查看>>