• c# winform vlcPlayer播放器


    vlcPlayer是一款免费开源的播放器项目,可以播放几乎所有的视频格式。

    第一步:获取dll

    安装vlcplayer视频播放器,在安装目录下面获取所需的dll。

    dll文件夹:plugins

    还有2个dll:libvlc.dll,libvlccore.dll

    第二步:获取播放器对象基类VlcPlayerBase

    using System;
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Text;
    
    namespace VlcPlayer
    {
        public class VlcPlayerBase
        {
            private IntPtr libvlc_instance_;
            private IntPtr libvlc_media_player_;
    
            /// <summary>
            /// 视频时长
            /// </summary>
            private double duration_;
    
            /// <summary>
            /// VLC 播放器。
            /// </summary>
            /// <param name="pluginPath"></param>
            public VlcPlayerBase(string pluginPath)
            {
                //string pluginPath = Environment.CurrentDirectory + "\vlc\plugins\";  //插件目录
                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_);  //创建 libvlc_media_player 播放核心
            }
    
            /// <summary>
            /// 设置播放容器
            /// </summary>
            /// <param name="wndHandle">播放容器句柄</param>
            public void SetRenderWindow(int wndHandle)
            {
                if (libvlc_instance_ != IntPtr.Zero && wndHandle != 0)
                {
                    LibVlcAPI.libvlc_media_player_set_hwnd(libvlc_media_player_, wndHandle);  //设置播放容器
                }
            }
            
            /// <summary>
            /// 播放指定媒体文件
            /// </summary>
            /// <param name="filePath"></param>
            public void LoadFile(string filePath)
            {
                IntPtr libvlc_media = LibVlcAPI.libvlc_media_new_path(libvlc_instance_, filePath);  //创建 libvlc_media_player 播放核心
                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_);  //播放
                }
            }
    
            /// <summary>
            /// 播放
            /// </summary>
            public void Play()
            {
                if (libvlc_media_player_ != IntPtr.Zero)
                {
                    LibVlcAPI.libvlc_media_player_play(libvlc_media_player_);
                }
            }
    
            /// <summary>
            /// 暂停播放
            /// </summary>
            public void Pause()
            {
                if (libvlc_media_player_ != IntPtr.Zero)
                {
                    LibVlcAPI.libvlc_media_player_pause(libvlc_media_player_);
                }
            }
    
            /// <summary>
            /// 停止播放
            /// </summary>
            public void Stop()
            {
                if (libvlc_media_player_ != IntPtr.Zero)
                {
                    LibVlcAPI.libvlc_media_player_stop(libvlc_media_player_);
                }
            }
    
            public void Release()
            {
                if (libvlc_media_player_ != IntPtr.Zero)
                {
                    LibVlcAPI.libvlc_media_release(libvlc_media_player_);
                }
            }
            
            /// <summary>
            /// 获取播放时间进度
            /// </summary>
            /// <returns></returns>
            public double GetPlayTime()
            {
                return LibVlcAPI.libvlc_media_player_get_time(libvlc_media_player_) / 1000.0;
            }
    
            /// <summary>
            /// 设置播放时间
            /// </summary>
            /// <param name="seekTime"></param>
            public void SetPlayTime(double seekTime)
            {
                LibVlcAPI.libvlc_media_player_set_time(libvlc_media_player_, (Int64)(seekTime * 1000));
            }
    
            /// <summary>
            /// 获取音量
            /// </summary>
            /// <returns></returns>
            public int GetVolume()
            {
                return LibVlcAPI.libvlc_audio_get_volume(libvlc_media_player_);
            }
    
            /// <summary>
            /// 设置音量
            /// </summary>
            /// <param name="volume"></param>
            public void SetVolume(int volume)
            {
                LibVlcAPI.libvlc_audio_set_volume(libvlc_media_player_, volume);
            }
    
            /// <summary>
            /// 设置是否全屏
            /// </summary>
            /// <param name="istrue"></param>
            public void SetFullScreen(bool istrue)
            {
                LibVlcAPI.libvlc_set_fullscreen(libvlc_media_player_, istrue ? 1 : 0);
            }
    
            /// <summary>
            /// 视频时长
            /// </summary>
            /// <returns></returns>
            public double Duration { get { return duration_; } }
    
            /// <summary>
            /// 是否正在播放
            /// </summary>
            public bool IsPlaying
            {
                get
                {
                    if (Duration > 0 && (int)GetPlayTime() == (int)Duration) this.Stop();  //如果播放完,关闭视频
    
                    return (int)GetPlayTime() < (int)Duration /* 播放时间进度小于视频时长 */
                        && Duration > 0 /* 播放时间进度大于0 */
                        && GetPlayTime() > 0; /* 视频时长大于0 */
                }
            }
            
            /// <summary>
            /// 获取版本(VS2015 调试模式程序会直接崩掉)
            /// </summary>
            /// <returns></returns>
            public string Version { get { return LibVlcAPI.libvlc_get_version(); } }
    
        }
    
        #region vlclib.dll
    
        internal static class LibVlcAPI
        {
            internal struct PointerToArrayOfPointerHelper
            {
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
                public IntPtr[] pointers;
            }
    
            /// <summary>
            /// 传入播放参数
            /// </summary>
            /// <param name="arguments"></param>
            /// <returns></returns>
            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]);  //将托管 System.String 中的内容复制到非托管内存,并在复制时转换为 ANSI 格式。
                }
    
                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);  //创建一个libvlc实例,它是引用计数的
                }
                finally
                {
                    for (int i = 0; i < arguments.Length + 1; i++)
                    {
                        if (argv.pointers[i] != IntPtr.Zero)
                        {
                            Marshal.FreeHGlobal(argv.pointers[i]);  //释放以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 从进程的非托管内存中分配的内存。
                        }
                    }
    
                    if (argvPtr != IntPtr.Zero) { Marshal.FreeHGlobal(argvPtr);/* 释放以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 从进程的非托管内存中分配的内存。 */ }
                }
            }
    
            /// <summary>
            /// 从本地文件系统路径新建,其他参照上一条
            /// </summary>
            /// <param name="libvlc_instance"></param>
            /// <param name="path"></param>
            /// <returns></returns>
            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);  // 从本地文件路径构建一个libvlc_media
                }
                finally
                {
                    if (pMrl != IntPtr.Zero) { Marshal.FreeHGlobal(pMrl);/* 释放以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 从进程的非托管内存中分配的内存。 */                }
                }
            }
    
            /// <summary>
            /// 使用一个给定的媒体资源路径来建立一个libvlc_media对象.参数psz_mrl为要读取的MRL(Media Resource Location).此函数返回新建的对象或NULL.
            /// </summary>
            /// <param name="libvlc_instance"></param>
            /// <param name="path"></param>
            /// <returns></returns>
            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);  // 从本地文件路径构建一个libvlc_media
                }
                finally
                {
                    if (pMrl != IntPtr.Zero) { Marshal.FreeHGlobal(pMrl);/* 释放以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 从进程的非托管内存中分配的内存。 */                }
                }
            }
    
            // ----------------------------------------------------------------------------------------
            // 以下是libvlc.dll导出函数
    
            /// <summary>
            /// 创建一个libvlc实例,它是引用计数的 
            /// </summary>
            /// <param name="argc"></param>
            /// <param name="argv"></param>
            /// <returns></returns>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            private static extern IntPtr libvlc_new(int argc, IntPtr argv);
    
            /// <summary>
            /// 释放libvlc实例 
            /// </summary>
            /// <param name="libvlc_instance"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_release(IntPtr libvlc_instance);
    
            /// <summary>
            /// 获取版本 
            /// </summary>
            /// <returns></returns>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern String libvlc_get_version();
    
            /// <summary>
            /// 从视频来源(例如Url)构建一个libvlc_meida 
            /// </summary>
            /// <param name="libvlc_instance"></param>
            /// <param name="path"></param>
            /// <returns></returns>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            private static extern IntPtr libvlc_media_new_location(IntPtr libvlc_instance, IntPtr path);
    
            /// <summary>
            /// 从本地文件路径构建一个libvlc_media 
            /// </summary>
            /// <param name="libvlc_instance"></param>
            /// <param name="path"></param>
            /// <returns></returns>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            private static extern IntPtr libvlc_media_new_path(IntPtr libvlc_instance, IntPtr path);
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="libvlc_media_inst"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_media_release(IntPtr libvlc_media_inst);
    
            /// <summary>
            /// 创建libvlc_media_player(播放核心) 
            /// </summary>
            /// <param name="libvlc_instance"></param>
            /// <returns></returns>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern IntPtr libvlc_media_player_new(IntPtr libvlc_instance);
    
            /// <summary>
            /// 将视频(libvlc_media)绑定到播放器上 
            /// </summary>
            /// <param name="libvlc_media_player"></param>
            /// <param name="libvlc_media"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_media_player_set_media(IntPtr libvlc_media_player, IntPtr libvlc_media);
    
            /// <summary>
            /// 设置图像输出的窗口 
            /// </summary>
            /// <param name="libvlc_mediaplayer"></param>
            /// <param name="drawable"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_media_player_set_hwnd(IntPtr libvlc_mediaplayer, Int32 drawable);
    
            #region 播放控制
            /// <summary>
            /// 播放 
            /// </summary>
            /// <param name="libvlc_mediaplayer"></param>
            [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_pause(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_stop(IntPtr libvlc_mediaplayer);
            #endregion
    
            /// <summary>
            /// 释放播放文件 
            /// </summary>
            /// <param name="libvlc_mediaplayer"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_media_player_release(IntPtr libvlc_mediaplayer);
    
            /// <summary>
            /// 解析视频资源的媒体信息(如时长等) 
            /// </summary>
            /// <param name="libvlc_media"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_media_parse(IntPtr libvlc_media);
    
            /// <summary>
            /// 返回视频的时长(必须先调用libvlc_media_parse之后,该函数才会生效) 
            /// </summary>
            /// <param name="libvlc_media"></param>
            /// <returns></returns>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern Int64 libvlc_media_get_duration(IntPtr libvlc_media);
    
    
            #region 播放时间进度 
    
            /// <summary>
            /// 当前播放的时间进度 
            /// </summary>
            /// <param name="libvlc_mediaplayer"></param>
            /// <returns></returns>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern Int64 libvlc_media_player_get_time(IntPtr libvlc_mediaplayer);
    
            /// <summary>
            /// 设置播放位置(拖动) 
            /// </summary>
            /// <param name="libvlc_mediaplayer"></param>
            /// <param name="time"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_media_player_set_time(IntPtr libvlc_mediaplayer, Int64 time);
    
            #endregion
    
            #region 音量
    
            /// <summary>
            /// 获取音量 
            /// </summary>
            /// <param name="libvlc_media_player"></param>
            /// <returns></returns>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern int libvlc_audio_get_volume(IntPtr libvlc_media_player);
    
            /// <summary>
            /// 设置音量
            /// </summary>
            /// <param name="libvlc_media_player"></param>
            /// <param name="volume"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_audio_set_volume(IntPtr libvlc_media_player, int volume);
    
            #endregion
    
            /// <summary>
            /// 设置全屏
            /// </summary>
            /// <param name="libvlc_media_player"></param>
            /// <param name="isFullScreen"></param>
            [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            [SuppressUnmanagedCodeSecurity]
            public static extern void libvlc_set_fullscreen(IntPtr libvlc_media_player, int isFullScreen);
    
            /// <summary>
            /// 获取播放状态。(Win10 不支持)
            /// </summary>
            /// <param name="libvlc_mediaplayer"></param>
            /// <returns></returns>
            //[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
            //[SuppressUnmanagedCodeSecurity]
            //public static extern Int64 libvlc_media_player_get_state(IntPtr libvlc_mediaplayer);
    
        }
    
        #endregion
    
    }

    第三步:写代码实现

    string pluginPath = Environment.CurrentDirectory + "\plugins\";  //插件目录
                player = new VlcPlayerBase(pluginPath);
                player.SetRenderWindow((int)pnlVideo.Handle);//panel
                player.LoadFile(videoName[0]);//视频文件路径

    设置音量:

    int volume = this.player.GetVolume();
    volume--;
    if (volume <0) volume = 0;
    this.player.SetVolume(volume);

    还有播放状态设置:

     this.player.Play();

    this.player.Pause();

    this.player.Stop();

    其他设置:

    int durationSecond = (int)this.player.Duration;
    int playTimeSecond = (int)this.player.GetPlayTime();

    this.player.SetPlayTime(this.tkbProgress.Value);

  • 相关阅读:
    雷文-武汉科技大学-软件工程-本科-20111020(2011年校园招聘找工作时的简历)
    雷文-武汉科技大学-软件工程-本科-20111020(2011年校园招聘找工作时的简历)
    大学生应当趁早谋划未来
    大学生应当趁早谋划未来
    提前了解客户背景很有必要
    提前了解客户背景很有必要
    雷文-武汉科技大学-软件工程-本科-20131118(我的最新简历)
    雷文-武汉科技大学-软件工程-本科-20131118(我的最新简历)
    《商君列传第八》–读书总结
    《商君列传第八》–读书总结
  • 原文地址:https://www.cnblogs.com/tiandi/p/6252580.html
Copyright © 2020-2023  润新知