289 lines
12 KiB
C#
289 lines
12 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Runtime.InteropServices;
|
|||
|
|
using System.Security;
|
|||
|
|
using System.Text;
|
|||
|
|
|
|||
|
|
|
|||
|
|
namespace dccdc.Selfhelp
|
|||
|
|
{
|
|||
|
|
class VlcPlayer
|
|||
|
|
{
|
|||
|
|
private IntPtr libvlc_instance_;
|
|||
|
|
private IntPtr libvlc_media_player_;
|
|||
|
|
private double duration_;
|
|||
|
|
public double ShiChang
|
|||
|
|
{
|
|||
|
|
get { return duration_; }
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
public VlcPlayer(string pluginPath)
|
|||
|
|
{
|
|||
|
|
string plugin_arg = "--plugin-path=" + pluginPath;
|
|||
|
|
string[] arguments = { "-I", "dummy", "--ignore-config", "--no-video-title", plugin_arg };
|
|||
|
|
libvlc_instance_ = LibVlcAPI.libvlc_new(arguments);
|
|||
|
|
|
|||
|
|
libvlc_media_player_ = LibVlcAPI.libvlc_media_player_new(libvlc_instance_);
|
|||
|
|
}
|
|||
|
|
public void SetRenderWindow(int wndHandle)
|
|||
|
|
{
|
|||
|
|
if (libvlc_instance_ != IntPtr.Zero && wndHandle != 0)
|
|||
|
|
{
|
|||
|
|
LibVlcAPI.libvlc_media_player_set_hwnd(libvlc_media_player_, wndHandle);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void PlayFile(string filePath)
|
|||
|
|
{
|
|||
|
|
IntPtr libvlc_media = LibVlcAPI.libvlc_media_new_path(libvlc_instance_, filePath);
|
|||
|
|
if (libvlc_media != IntPtr.Zero)
|
|||
|
|
{
|
|||
|
|
LibVlcAPI.libvlc_media_parse(libvlc_media);
|
|||
|
|
duration_ = LibVlcAPI.libvlc_media_get_duration(libvlc_media) / 1000.0;
|
|||
|
|
LibVlcAPI.libvlc_media_player_set_media(libvlc_media_player_, libvlc_media);
|
|||
|
|
LibVlcAPI.libvlc_media_release(libvlc_media);
|
|||
|
|
LibVlcAPI.libvlc_media_player_play(libvlc_media_player_);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void Pause()
|
|||
|
|
{
|
|||
|
|
if (libvlc_media_player_ != IntPtr.Zero)
|
|||
|
|
{
|
|||
|
|
LibVlcAPI.libvlc_media_player_pause(libvlc_media_player_);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void Play()
|
|||
|
|
{
|
|||
|
|
if (libvlc_media_player_ != IntPtr.Zero)
|
|||
|
|
{
|
|||
|
|
LibVlcAPI.libvlc_media_player_play(libvlc_media_player_);
|
|||
|
|
// LibVlcAPI.libvlc_media_player_pause(libvlc_media_player_);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void Stop()
|
|||
|
|
{
|
|||
|
|
if (libvlc_media_player_ != IntPtr.Zero)
|
|||
|
|
{
|
|||
|
|
LibVlcAPI.libvlc_media_player_stop(libvlc_media_player_);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// public void FastForward()
|
|||
|
|
// {
|
|||
|
|
// if (libvlc_media_player_ != IntPtr.Zero)
|
|||
|
|
// {
|
|||
|
|
// LibVlcAPI.libvlc_media_player_fastforward(libvlc_media_player_);
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
public double GetPlayTime()
|
|||
|
|
{
|
|||
|
|
return LibVlcAPI.libvlc_media_player_get_time(libvlc_media_player_) / 1000.0;
|
|||
|
|
}
|
|||
|
|
public void SetPlayTime(double seekTime)
|
|||
|
|
{
|
|||
|
|
LibVlcAPI.libvlc_media_player_set_time(libvlc_media_player_, (Int64)(seekTime * 1000));
|
|||
|
|
}
|
|||
|
|
public int GetVolume()
|
|||
|
|
{
|
|||
|
|
return LibVlcAPI.libvlc_audio_get_volume(libvlc_media_player_);
|
|||
|
|
}
|
|||
|
|
public void SetVolume(int volume)
|
|||
|
|
{
|
|||
|
|
LibVlcAPI.libvlc_audio_set_volume(libvlc_media_player_, volume);
|
|||
|
|
}
|
|||
|
|
public void SetFullScreen(bool istrue)
|
|||
|
|
{
|
|||
|
|
LibVlcAPI.libvlc_set_fullscreen(libvlc_media_player_, istrue ? 1 : 0);
|
|||
|
|
}
|
|||
|
|
public double Duration()
|
|||
|
|
{
|
|||
|
|
return duration_;
|
|||
|
|
}
|
|||
|
|
public string Version()
|
|||
|
|
{
|
|||
|
|
return LibVlcAPI.libvlc_get_version();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
internal static class LibVlcAPI
|
|||
|
|
{
|
|||
|
|
internal struct PointerToArrayOfPointerHelper
|
|||
|
|
{
|
|||
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
|
|||
|
|
public IntPtr[] pointers;
|
|||
|
|
}
|
|||
|
|
public static IntPtr libvlc_new(string[] arguments)
|
|||
|
|
{
|
|||
|
|
PointerToArrayOfPointerHelper argv = new PointerToArrayOfPointerHelper();
|
|||
|
|
argv.pointers = new IntPtr[11];
|
|||
|
|
for (int i = 0; i < arguments.Length; i++)
|
|||
|
|
{
|
|||
|
|
argv.pointers[i] = Marshal.StringToHGlobalAnsi(arguments[i]);
|
|||
|
|
}
|
|||
|
|
IntPtr argvPtr = IntPtr.Zero;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
int size = Marshal.SizeOf(typeof(PointerToArrayOfPointerHelper));
|
|||
|
|
argvPtr = Marshal.AllocHGlobal(size);
|
|||
|
|
Marshal.StructureToPtr(argv, argvPtr, false);
|
|||
|
|
return libvlc_new(arguments.Length, argvPtr);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < arguments.Length + 1; i++)
|
|||
|
|
{
|
|||
|
|
if (argv.pointers[i] != IntPtr.Zero)
|
|||
|
|
{
|
|||
|
|
Marshal.FreeHGlobal(argv.pointers[i]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (argvPtr != IntPtr.Zero)
|
|||
|
|
{
|
|||
|
|
Marshal.FreeHGlobal(argvPtr);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public static IntPtr libvlc_media_new_path(IntPtr libvlc_instance, string path)
|
|||
|
|
{
|
|||
|
|
IntPtr pMrl = IntPtr.Zero;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
byte[] bytes = Encoding.UTF8.GetBytes(path);
|
|||
|
|
pMrl = Marshal.AllocHGlobal(bytes.Length + 1);
|
|||
|
|
Marshal.Copy(bytes, 0, pMrl, bytes.Length);
|
|||
|
|
Marshal.WriteByte(pMrl, bytes.Length, 0);
|
|||
|
|
return libvlc_media_new_path(libvlc_instance, pMrl);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
if (pMrl != IntPtr.Zero)
|
|||
|
|
{
|
|||
|
|
Marshal.FreeHGlobal(pMrl);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public static IntPtr libvlc_media_new_location(IntPtr libvlc_instance, string path)
|
|||
|
|
{
|
|||
|
|
IntPtr pMrl = IntPtr.Zero;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
byte[] bytes = Encoding.UTF8.GetBytes(path);
|
|||
|
|
pMrl = Marshal.AllocHGlobal(bytes.Length + 1);
|
|||
|
|
Marshal.Copy(bytes, 0, pMrl, bytes.Length);
|
|||
|
|
Marshal.WriteByte(pMrl, bytes.Length, 0);
|
|||
|
|
return libvlc_media_new_path(libvlc_instance, pMrl);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
if (pMrl != IntPtr.Zero)
|
|||
|
|
{
|
|||
|
|
Marshal.FreeHGlobal(pMrl);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ----------------------------------------------------------------------------------------
|
|||
|
|
// 以下是libvlc.dll导出函数
|
|||
|
|
|
|||
|
|
// 创建一个libvlc实例,它是引用计数的
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
private static extern IntPtr libvlc_new(int argc, IntPtr argv);
|
|||
|
|
|
|||
|
|
// 释放libvlc实例
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_release(IntPtr libvlc_instance);
|
|||
|
|
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern String libvlc_get_version();
|
|||
|
|
|
|||
|
|
// 从视频来源(例如Url)构建一个libvlc_meida
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
private static extern IntPtr libvlc_media_new_location(IntPtr libvlc_instance, IntPtr path);
|
|||
|
|
|
|||
|
|
// 从本地文件路径构建一个libvlc_media
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
private static extern IntPtr libvlc_media_new_path(IntPtr libvlc_instance, IntPtr path);
|
|||
|
|
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_release(IntPtr libvlc_media_inst);
|
|||
|
|
|
|||
|
|
// 创建libvlc_media_player(播放核心)
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern IntPtr libvlc_media_player_new(IntPtr libvlc_instance);
|
|||
|
|
|
|||
|
|
// 将视频(libvlc_media)绑定到播放器上
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_player_set_media(IntPtr libvlc_media_player, IntPtr libvlc_media);
|
|||
|
|
|
|||
|
|
// 设置图像输出的窗口
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_player_set_hwnd(IntPtr libvlc_mediaplayer, Int32 drawable);
|
|||
|
|
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_player_play(IntPtr libvlc_mediaplayer);
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="libvlc_mediaplayer"></param>
|
|||
|
|
//[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
//[SuppressUnmanagedCodeSecurity]
|
|||
|
|
// public static extern void libvlc_media_player_fastforward(IntPtr libvlc_mediaplayer);
|
|||
|
|
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_player_pause(IntPtr libvlc_mediaplayer);
|
|||
|
|
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_player_stop(IntPtr libvlc_mediaplayer);
|
|||
|
|
|
|||
|
|
// 解析视频资源的媒体信息(如时长等)
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_parse(IntPtr libvlc_media);
|
|||
|
|
|
|||
|
|
// 返回视频的时长(必须先调用libvlc_media_parse之后,该函数才会生效)
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern Int64 libvlc_media_get_duration(IntPtr libvlc_media);
|
|||
|
|
|
|||
|
|
// 当前播放的时间
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern Int64 libvlc_media_player_get_time(IntPtr libvlc_mediaplayer);
|
|||
|
|
|
|||
|
|
// 设置播放位置(拖动)
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_player_set_time(IntPtr libvlc_mediaplayer, Int64 time);
|
|||
|
|
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_media_player_release(IntPtr libvlc_mediaplayer);
|
|||
|
|
|
|||
|
|
// 获取和设置音量
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern int libvlc_audio_get_volume(IntPtr libvlc_media_player);
|
|||
|
|
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_audio_set_volume(IntPtr libvlc_media_player, int volume);
|
|||
|
|
|
|||
|
|
// 设置全屏
|
|||
|
|
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
|||
|
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
|
public static extern void libvlc_set_fullscreen(IntPtr libvlc_media_player, int isFullScreen);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|