From 76261739881093f09875742ffa1c9c33f54b2b05 Mon Sep 17 00:00:00 2001 From: "allen.yan" Date: Fri, 15 Aug 2025 17:53:55 +0800 Subject: [PATCH] =?UTF-8?q?202508151750=20=E8=AA=BF=E6=95=B4=E6=9C=89?= =?UTF-8?q?=E7=84=A1=E4=BA=BA=E8=81=B2=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/MediaService.cs | 14 +++------ VideoPlayerForm.cs | 67 +++++++++++++++++++++++++++------------- 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/Services/MediaService.cs b/Services/MediaService.cs index 4f63fc0..8a31625 100644 --- a/Services/MediaService.cs +++ b/Services/MediaService.cs @@ -9,16 +9,15 @@ namespace DualScreenDemo.Services private Media? _media; private bool _disposed; - public MediaService(nint handle) + public MediaService() { Core.Initialize(); _libVLC = new LibVLC( "--aout=directsound", "--network-caching=300", "--file-caching=300", - "--audio-time-stretch", - "--video-filter=clone" - //$"--clone-views={handle}" // 這是 clone 的目標視窗 + "--audio-time-stretch" + ); _mediaPlayer = new MediaPlayer(_libVLC); @@ -52,13 +51,10 @@ namespace DualScreenDemo.Services _media = new Media(_libVLC, filePath, FromType.FromPath); _media.AddOption(":audio-output=directsound"); _media.AddOption($":audio-track={audioTrackIndex}"); - } - - public void Play() - { - if (_media == null) return; _mediaPlayer.Play(_media); } + + public void Play() => _mediaPlayer.Play(); public void Pause() => _mediaPlayer.Pause(); public void Stop() => _mediaPlayer.Stop(); #endregion diff --git a/VideoPlayerForm.cs b/VideoPlayerForm.cs index 6613d34..636c7b9 100644 --- a/VideoPlayerForm.cs +++ b/VideoPlayerForm.cs @@ -66,8 +66,8 @@ namespace DualScreenDemo private const int GWL_EXSTYLE = -20; private const int WS_EX_TOPMOST = 0x00000008; private const uint SWP_NOZORDER = 0x0004; - //private MediaServicePrimary primary = new MediaServicePrimary(); - private MediaService _media; + private MediaService _mediaService0= new MediaService(); + private MediaService _mediaService1= new MediaService(); public static OverlayForm overlayForm; public bool isMuted = false; @@ -121,16 +121,16 @@ namespace DualScreenDemo } else { - _media= new MediaService(PrimaryForm.Instance.videoPanel.Handle); - _media.SetVideoOutput(this.Handle, secondMonitor.Bounds.Width, secondMonitor.Bounds.Height); - + _mediaService0.SetVideoOutput(PrimaryForm.Instance.videoPanel.Handle,PrimaryForm.Instance.videoPanel.Width,PrimaryForm.Instance.videoPanel.Height); + _mediaService1.SetVideoOutput(this.Handle, secondMonitor.Bounds.Width, secondMonitor.Bounds.Height); PlayNextSong(); } } private void VideoPlayerForm_FormClosing(object sender, FormClosingEventArgs e) { - _media.Dispose(); + _mediaService0.Dispose(); + _mediaService1.Dispose(); // 清理COM CoUninitialize(); } @@ -332,10 +332,11 @@ namespace DualScreenDemo private Task InitializeAndPlayMedia(SongData song) { string pathToPlay = song.getFile(); - // 渲染媒體文件 - _media.LoadMedia(pathToPlay,song.isPublicSong ? 0 : 1); - _media.Mute(isMuted); - _media.Play(); + _mediaService0.LoadMedia(pathToPlay, 0); + _mediaService0.Mute(isMuted); + _mediaService1.LoadMedia(pathToPlay, song.isPublicSong ? 0 : 1); + _mediaService1.Mute(isMuted); + // 音量處理 //SetVolume(isMuted ? 0 : previousVolume); @@ -370,7 +371,7 @@ namespace DualScreenDemo { try { - if (_media.IsAtEnd()) + if (_mediaService0.IsAtEnd() || _mediaService1.IsAtEnd()) { BeginInvoke(new Action(async () => { @@ -381,7 +382,6 @@ namespace DualScreenDemo catch (Exception ex) { Console.WriteLine($"監控媒體事件時發生錯誤: {ex.Message}"); - await Task.Delay(1000); } await Task.Delay(1000); @@ -405,19 +405,22 @@ namespace DualScreenDemo public void Play() { - _media.Play(); + _mediaService0.Play(); + _mediaService1.Play(); isPaused = false; OverlayForm.MainForm.HidePauseLabel(); } public void Stop() { - _media.Stop(); + _mediaService0.Stop(); + _mediaService1.Stop(); } public void Pause() { - _media.Pause(); + _mediaService0.Pause(); + _mediaService1.Pause(); isPaused = true; OverlayForm.MainForm.ShowPauseLabel(); } @@ -456,23 +459,45 @@ namespace DualScreenDemo } public bool Mute(bool isMuted) { - return _media.Mute(isMuted); + if(isMuted){ + if(isVocalRemoved){ + _mediaService0.Mute(true); + _mediaService1.Mute(false); + }else{ + _mediaService0.Mute(false); + _mediaService1.Mute(true); + } + }else{ + _mediaService0.Mute(false); + _mediaService1.Mute(false); + } + + return isMuted; } public void SetVolume(int volume) { Console.WriteLine($"SetVolume: {volume}"); - _media.SetVolume(volume); + _mediaService0.SetVolume(volume); + _mediaService1.SetVolume(volume); } public int GetVolume() { - return _media.GetVolume(); + + return _mediaService1.GetVolume(); } - private bool isVocalRemoved = false; + private bool isVocalRemoved = true; public void ToggleVocalRemoval() { isVocalRemoved=!isVocalRemoved; - int trackIndex = isVocalRemoved ? 1:0; - _media.SetAudioTrack(trackIndex); + if(isVocalRemoved){ + _mediaService0.Mute(true); + _mediaService1.Mute(false); + }else{ + _mediaService0.Mute(false); + _mediaService1.Mute(true); + } + //int trackIndex = isVocalRemoved ? 1:0; + //_mediaService.SetAudioTrack(trackIndex); OverlayForm.MainForm.ShowTopRightLabelTime(isVocalRemoved ? "無人聲" : "有人聲"); } }