/// <summary> /// 提供指定的参数初始化一个 Vlc 实例 /// </summary> /// <param name="argv"></param> /// <exception cref="VlcCreateFailException">Can't create a Vlc instence, check your Vlc options.</exception> /// <exception cref="Exception">A delegate callback throws an exception.</exception> public Vlc(String[] argv) { InstancePointer = argv == null ? _newInstanceFunction.Delegate(0, IntPtr.Zero) : _newInstanceFunction.Delegate(argv.Length, InteropHelper.StringArrayToPtr(argv)); if (InstancePointer == IntPtr.Zero) { var ex = VlcError.GetErrorMessage(); throw new VlcCreateFailException(ex); } EventManager = new VlcEventManager(this, _getMediaEventManagerFunction.Delegate(InstancePointer)); _onVlmMediaAdded = OnVlmMediaAdded; _onVlmMediaRemoved = OnVlmMediaRemoved; _onVlmMediaChanged = OnVlmMediaChanged; _onVlmMediaInstanceStarted = OnVlmMediaInstanceStarted; _onVlmMediaInstanceStopped = OnVlmMediaInstanceStopped; _onVlmMediaInstanceStatusInit = OnVlmMediaInstanceStatusInit; _onVlmMediaInstanceStatusOpening = OnVlmMediaInstanceStatusOpening; _onVlmMediaInstanceStatusPlaying = OnVlmMediaInstanceStatusPlaying; _onVlmMediaInstanceStatusPause = OnVlmMediaInstanceStatusPause; _onVlmMediaInstanceStatusEnd = OnVlmMediaInstanceStatusEnd; _onVlmMediaInstanceStatusError = OnVlmMediaInstanceStatusError; _onVlmMediaAddedHandle = GCHandle.Alloc(_onVlmMediaAdded); _onVlmMediaRemovedHandle = GCHandle.Alloc(_onVlmMediaRemoved); _onVlmMediaChangedHandle = GCHandle.Alloc(_onVlmMediaChanged); _onVlmMediaInstanceStartedHandle = GCHandle.Alloc(_onVlmMediaInstanceStarted); _onVlmMediaInstanceStoppedHandle = GCHandle.Alloc(_onVlmMediaInstanceStopped); _onVlmMediaInstanceStatusInitHandle = GCHandle.Alloc(_onVlmMediaInstanceStatusInit); _onVlmMediaInstanceStatusOpeningHandle = GCHandle.Alloc(_onVlmMediaInstanceStatusOpening); _onVlmMediaInstanceStatusPlayingHandle = GCHandle.Alloc(_onVlmMediaInstanceStatusPlaying); _onVlmMediaInstanceStatusPauseHandle = GCHandle.Alloc(_onVlmMediaInstanceStatusPause); _onVlmMediaInstanceStatusEndHandle = GCHandle.Alloc(_onVlmMediaInstanceStatusEnd); _onVlmMediaInstanceStatusErrorHandle = GCHandle.Alloc(_onVlmMediaInstanceStatusError); HandleManager.Add(this); EventManager.Attach(EventTypes.VlmMediaAdded, _onVlmMediaAdded, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaRemoved, _onVlmMediaRemoved, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaChanged, _onVlmMediaChanged, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaInstanceStarted, _onVlmMediaInstanceStarted, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaInstanceStopped, _onVlmMediaInstanceStopped, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaInstanceStatusInit, _onVlmMediaInstanceStatusInit, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaInstanceStatusOpening, _onVlmMediaInstanceStatusOpening, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaInstanceStatusPlaying, _onVlmMediaInstanceStatusPlaying, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaInstanceStatusPause, _onVlmMediaInstanceStatusPause, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaInstanceStatusEnd, _onVlmMediaInstanceStatusEnd, IntPtr.Zero); EventManager.Attach(EventTypes.VlmMediaInstanceStatusError, _onVlmMediaInstanceStatusError, IntPtr.Zero); }
/// <summary> /// 提供指定的参数初始化一个 Vlc 实例 /// </summary> /// <param name="argv"></param> public Vlc(String[] argv) { if (!IsLibLoaded) { LoadLibVlc(); } InstancePointer = argv == null?_newInstanceFunction.Delegate(0, IntPtr.Zero) : _newInstanceFunction.Delegate(argv.Length, InteropHelper.StringArrayToPtr(argv)); if (InstancePointer == IntPtr.Zero) { var ex = VlcError.GetErrorMessage(); throw new Exception(ex); } HandleManager.Add(this); }
/// <summary> /// 使用已经设定好的路径,载入 LibVlc /// </summary> public static void LoadLibVlc() { if (!IsLibLoaded) { try { FileInfo libcore = new FileInfo(Path.Combine(LibDirectory, @"libvlccore.dll")); FileInfo libvlc = new FileInfo(Path.Combine(LibDirectory, @"libvlc.dll")); LibCoreHandle = Win32Api.LoadLibrary(libcore.FullName); LibHandle = Win32Api.LoadLibrary(libvlc.FullName); } catch (Win32Exception e) { throw new Exception("无法载入 LibVlc 库", e); } _getVersionFunction = new LibVlcFunction <GetVersion>(LibHandle); var versionString = InteropHelper.PtrToString(_getVersionFunction.Delegate()); var match = Regex.Match(versionString, "^[0-9.]*"); if (match.Success) { LibVersion = new Version(match.Groups[0].Value); } var devString = LibDev = versionString.Split(' ', '-')[1]; _newInstanceFunction = new LibVlcFunction <NewInstance>(LibHandle, LibVersion, devString); _releaseInstanceFunction = new LibVlcFunction <ReleaseInstance>(LibHandle, LibVersion, devString); _retainInstanceFunction = new LibVlcFunction <RetainInstance>(LibHandle, LibVersion, devString); _addInterfaceFunction = new LibVlcFunction <AddInterface>(LibHandle, LibVersion, devString); _setExitHandlerFunction = new LibVlcFunction <SetExitHandler>(LibHandle, LibVersion, devString); _waitFunction = new LibVlcFunction <Wait>(LibHandle, LibVersion, devString); _setUserAgentFunction = new LibVlcFunction <SetUserAgent>(LibHandle, LibVersion, devString); _setAppIdFunction = new LibVlcFunction <SetAppId>(LibHandle, LibVersion, devString); _getCompilerFunction = new LibVlcFunction <GetCompiler>(LibHandle, LibVersion, devString); _getChangesetFunction = new LibVlcFunction <GetChangeset>(LibHandle, LibVersion, devString); _freeFunction = new LibVlcFunction <Free>(LibHandle, LibVersion, devString); _releaseLibVlcModuleDescriptionFunction = new LibVlcFunction <ReleaseLibVlcModuleDescription>(LibHandle, LibVersion, devString); _getAudioFilterListFunction = new LibVlcFunction <GetAudioFilterList>(LibHandle, LibVersion, devString); _getVideoFilterListFunction = new LibVlcFunction <GetVideoFilterList>(LibHandle, LibVersion, devString); VlcError.LoadLibVlc(LibHandle, LibVersion, devString); VlcEventManager.LoadLibVlc(LibHandle, LibVersion, devString); VlcMedia.LoadLibVlc(LibHandle, LibVersion, devString); VlcMediaPlayer.LoadLibVlc(LibHandle, LibVersion, devString); IsLibLoaded = true; } }
/// <summary> /// Load LibVlc dlls, and mapping all function. /// </summary> /// <param name="libVlcDirectory">directory of LibVlc</param> /// <exception cref="LibVlcLoadLibraryException"> /// Can't load LibVlc dlls, check the platform and LibVlc target platform /// (should be same, x86 or x64). /// </exception> /// <exception cref="TypeLoadException">A custom attribute type cannot be loaded. </exception> /// <exception cref="NoLibVlcFunctionAttributeException"> /// For LibVlcFunction, need LibVlcFunctionAttribute to get Infomation /// of function. /// </exception> /// <exception cref="FunctionNotFoundException">Can't find function in dll.</exception> /// <exception cref="VersionStringParseException">Can't parse libvlc version string, it must like "2.2.0-xZune Weatherwax".</exception> /// <exception cref="OverflowException"> /// At least one component of version represents a number greater than /// <see cref="F:System.Int32.MaxValue" />. /// </exception> public static void LoadLibVlc(String libVlcDirectory = null) { LibVlcDirectory = libVlcDirectory == null ? "" : libVlcDirectory; if (IsLibLoaded) { return; } try { FileInfo libcore = new FileInfo(Path.Combine(LibVlcDirectory, "libvlccore.dll")); FileInfo libvlc = new FileInfo(Path.Combine(LibVlcDirectory, "libvlc.dll")); LibVlcVCoreHandle = Win32Api.LoadLibrary(libcore.FullName); LibVlcHandle = Win32Api.LoadLibrary(libvlc.FullName); } catch (Win32Exception e) { throw new LibVlcLoadLibraryException(e); } _getVersionFunction = new LibVlcFunction <GetVersion>(); LibVlcVersion = new LibVlcVersion(GetVersion()); _getCompilerFunction = new LibVlcFunction <GetCompiler>(); _getChangesetFunction = new LibVlcFunction <GetChangeset>(); _freeFunction = new LibVlcFunction <Free>(); _releaseLibVlcModuleDescriptionFunction = new LibVlcFunction <ReleaseLibVlcModuleDescription>(); _releaseAudioOutputListFunction = new LibVlcFunction <ReleaseAudioOutputList>(); _releaseAudioDeviceListFunction = new LibVlcFunction <ReleaseAudioDeviceList>(); _releaseTrackDescriptionFunction = new LibVlcFunction <ReleaseTrackDescription>(); _releaseTracksFunction = new LibVlcFunction <ReleaseTracks>(); Vlc.LoadLibVlc(); VlcError.LoadLibVlc(); VlcEventManager.LoadLibVlc(); VlcMedia.LoadLibVlc(); VlcMediaPlayer.LoadLibVlc(); AudioEqualizer.LoadLibVlc(); }
/* * public void GetSubitems() * { * return GetSubitemsFunction.Delegate(InstancePointer); * } */ /// <summary> /// 获取媒体的基本流的描述,注意,在调用该方法之前你需要首先调用 <see cref="VlcMedia.Parse"/> 方法,或者至少播放一次. /// 否则,你将的得到一个空数组 /// </summary> public MediaTrack[] GetTracks() { var pointer = IntPtr.Zero; var count = _getTracksFunction.Delegate(InstancePointer, ref pointer); if (pointer == IntPtr.Zero) { var ex = VlcError.GetErrorMessage(); throw new Exception(ex); } var result = new MediaTrack[count]; var temp = pointer; for (var i = 0; i < count; i++) { var p = Marshal.ReadIntPtr(temp); result[i] = (MediaTrack)Marshal.PtrToStructure(p, typeof(MediaTrack)); temp = (IntPtr)((int)temp + Marshal.SizeOf(typeof(IntPtr))); } _releaseTracksFunction.Delegate(pointer, count); return(result); }