請移步https://higoge.github.io/,全部下載資料在那個博客都能找到。謝謝。 php
--------------------------------------------------------------------git
vlc-0.9.4提供的libvlc.dll是能夠動態調用的,Jeremiah這一篇博客就介紹下如何用C#和WinForm框架調用libvlc.dll做個簡易播放器。
github
1. vs2005新建工程,將vlc-0.9.4的libvlc.dll,libvlccore.dll,plugins目錄所有拷貝到工程目錄下面\bin\Debug中。c#
2. 建立異常結構體app
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類ide
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);
}
}
this
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類,注意裏面的非英文路徑處理方法。url
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, ref ExceptionStruct 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, ref ExceptionStruct 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]