85 lines
2.5 KiB
C#
85 lines
2.5 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Timers;
|
|
using System.Windows.Forms;
|
|
using CdgLib;
|
|
using Vlc.DotNet.Core;
|
|
|
|
namespace KaraokePlayer
|
|
{
|
|
public partial class KaraokeVideoPlayer : UserControl
|
|
{
|
|
private readonly PictureBox _lyrics = new PictureBox {Dock = DockStyle.Fill};
|
|
private CdgFile _cdgFile;
|
|
private Image _lyricImage;
|
|
private OverlayForm _overlayForm;
|
|
private DateTime _startTime;
|
|
private readonly System.Timers.Timer _lyricTimer = new System.Timers.Timer();
|
|
|
|
public KaraokeVideoPlayer()
|
|
{
|
|
InitializeComponent();
|
|
_lyricTimer.Interval = 30;
|
|
_lyricTimer.Elapsed += LyricTimerOnElapsed;
|
|
}
|
|
|
|
private async void LyricTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
|
|
{
|
|
System.Diagnostics.Debug.Print(DateTime.Now.Millisecond.ToString());
|
|
if (vlcPlayer.IsPlaying)
|
|
{
|
|
await Task.Run(() =>
|
|
{
|
|
_cdgFile.RenderAtPosition(
|
|
(long)(DateTime.Now - _startTime).TotalMilliseconds);
|
|
});
|
|
|
|
|
|
Invoke((MethodInvoker)(() =>
|
|
{
|
|
_lyrics.Image = _cdgFile.RgbImage;
|
|
_lyrics.BackColor = ((Bitmap)_cdgFile.RgbImage).GetPixel(1, 1);
|
|
}));
|
|
}
|
|
else
|
|
{
|
|
this.Enabled = false;
|
|
}
|
|
}
|
|
|
|
public void Play(Uri file)
|
|
{
|
|
vlcPlayer.SetMedia(file);
|
|
_cdgFile = new CdgFile(Path.ChangeExtension(file.LocalPath, "cdg"));
|
|
vlcPlayer.Play();
|
|
}
|
|
|
|
private void vlcPlayer_Playing(object sender, VlcMediaPlayerPlayingEventArgs e)
|
|
{
|
|
_startTime = DateTime.Now;
|
|
_lyricTimer.Start();
|
|
}
|
|
|
|
private void vlcPlayer_TimeChanged(object sender, VlcMediaPlayerTimeChangedEventArgs e)
|
|
{
|
|
_startTime = DateTime.Now.AddMilliseconds(-e.NewTime);
|
|
}
|
|
|
|
private void vlcPlayer_Stopped(object sender, VlcMediaPlayerStoppedEventArgs e)
|
|
{
|
|
_overlayForm.Hide();
|
|
}
|
|
|
|
private void KaraokeVideoPlayer_ParentChanged(object sender, EventArgs e)
|
|
{
|
|
if (ParentForm != null)
|
|
{
|
|
_overlayForm = new OverlayForm(this);
|
|
_overlayForm.Controls.Add(_lyrics);
|
|
}
|
|
}
|
|
}
|
|
} |