using CefSharp.Wpf; using Container.Business; using Container.ChildWindows; using Container.Common; using Container.Model; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Vlc.DotNet.Wpf; namespace Container.Win { /// /// ProgControl.xaml 的交互逻辑 /// public partial class ProgControl : UserControl { string outLinePath; App app = ((App)System.Windows.Application.Current); DirectoryInfo vlcLibDirectory; backgroundMaterialInfo backgroundMaterial; string backgroundColor; List components; private Thread th1;//播放屏保的线程 bool isStop = false; BrushConverter converter = new BrushConverter(); List tasks = new List(); List marqueeControlNews = new List(); List clockControls = new List(); List weatherControls = new List(); List imageControls = new List(); List mediaControls = new List(); List chromiumWebBrowsers = new List(); List canvasWebBrowsers = new List(); VlcControl vlcControl1 = new VlcControl(); VlcControl vlcControl2 = new VlcControl(); string vlcVideoPath = string.Empty; string vlcVideo2Path = string.Empty; List cancellationTokens = new List(); string[] options; public ProgControl() { InitializeComponent(); var currentAssembly = Assembly.GetEntryAssembly(); var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName; // Default installation path of VideoLAN.LibVLC.Windows vlcLibDirectory = new DirectoryInfo(currentDirectory); //初始化配置,指定引用库 vlcControl1.SourceProvider.CreatePlayer(vlcLibDirectory); //初始化配置,指定引用库 vlcControl2.SourceProvider.CreatePlayer(vlcLibDirectory); // options = new string[]{ // "-I", //"dummy", //"--ignore-config", //"--extraintf=logger", //"--verbose=2", //"--fullscreen", //"--network-caching=300", //"--live-caching=300", //"--sout-mux-caching=300", //"--file-caching=300", //"--codec=mediacodec,iomx,all", //"--quiet-synchro", //" --clock-synchro=300", //"--network-synchronisation", //"--cr-average=10000" // }; options = new string[] { "-I", "dummy", "--network-caching=<300", ":sout=#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100" }; canvas.Children.Add(vlcControl1); canvas.Children.Add(vlcControl2); } private void MediaPlayer_EndReached(object sender, Vlc.DotNet.Core.VlcMediaPlayerEndReachedEventArgs e) { Task.Factory.StartNew(() => { //this.sourceProvider = null; Application.Current.Dispatcher.BeginInvoke(new Action(() => { vlcControl1.SourceProvider.MediaPlayer.Play(vlcVideoPath); })); }); } private void MediaPlayer2_EndReached(object sender, Vlc.DotNet.Core.VlcMediaPlayerEndReachedEventArgs e) { Task.Factory.StartNew(() => { //this.sourceProvider = null; Application.Current.Dispatcher.BeginInvoke(new Action(() => { vlcControl2.SourceProvider.MediaPlayer.Play(vlcVideo2Path); })); }); } public void LoadProg(double width, double height, backgroundMaterialInfo backgroundmaterial, string backgroundcolor, List componentList) { backgroundMaterial = backgroundmaterial; backgroundColor = backgroundcolor; components = componentList; this.Width = width; this.Height = height; canvas.Width = width; canvas.Height = height; try { outLinePath = AppDomain.CurrentDomain.BaseDirectory + "/OutlineFiles"; if (backgroundMaterial != null) { string fileExtension = string.Empty; if (backgroundMaterial.filePath.Contains("?")) { fileExtension = backgroundMaterial.filePath.Substring(backgroundMaterial.filePath.LastIndexOf("."), backgroundMaterial.filePath.LastIndexOf("?") - backgroundMaterial.filePath.LastIndexOf(".")).ToLower(); } else { fileExtension = backgroundMaterial.filePath.Substring(backgroundMaterial.filePath.LastIndexOf(".")).ToLower(); } string url = outLinePath + "/Main/" + backgroundMaterial.fileHash + fileExtension; if (File.Exists(url)) { Image image = new Image();//新建图片对象 image.Source = new BitmapImage(new Uri(url));//读取图片 ImageBrush ib = new ImageBrush();//新建图片对象 ib.ImageSource = image.Source;//赋值为背景图片 canvas.Background = ib;//将图片对象赋值给Canvas的Background } } else if (!string.IsNullOrEmpty(backgroundColor)) { Color color = (Color)ColorConverter.ConvertFromString(backgroundColor); canvas.Background = new SolidColorBrush(color); } int vlcCount = 0; isStop = false; foreach (var item in components) { if ((item.materials == null || item.materials.Count == 0) && (item.typeCode == "text" || item.typeCode == "image" || item.typeCode == "video"||item.typeCode== "audio" || item.typeCode == "html" || item.typeCode == "url")) { continue; } if (item.typeCode == "image") { Image image = new Image(); image.Width = item.width; image.Height = item.height; imageControls.Add(image); canvas.Children.Add(image); Canvas.SetLeft(image, item.offsetX); Canvas.SetZIndex(image, item.zIndex); Canvas.SetTop(image, item.offsetY); image.Stretch = Stretch.Fill; PlayImage(image, item.materials, item.config); } if (item.typeCode == "video") { vlcCount++; if (vlcCount == 1) { vlcControl1.Width = item.width; vlcControl1.Height = item.height; Canvas.SetLeft(vlcControl1, item.offsetX); Canvas.SetZIndex(vlcControl1, item.zIndex); Canvas.SetTop(vlcControl1, item.offsetY); PlayVideo(vlcControl1, item.materials, item.config, 1); } else { vlcControl2.Width = item.width; vlcControl2.Height = item.height; Canvas.SetLeft(vlcControl2, item.offsetX); Canvas.SetZIndex(vlcControl2, item.zIndex); Canvas.SetTop(vlcControl2, item.offsetY); PlayVideo(vlcControl2, item.materials, item.config, 2); } } if (item.typeCode == "text" && item.materials != null && item.materials.Count > 0) { var textBackgroundColor = item.config.Value("backgroundColor"); var textBackgroundOpacity = item.config.Value("backgroundOpacity"); var textFontColor = item.config.Value("fontColor"); var textFontSize = item.config.Value("fontSize"); var textFontStyle = item.config.Value("fontStyle"); var textAnimationSpeed = item.config.Value("animationSpeed"); string fileExtension = string.Empty; string url = string.Empty; if (item.materials[0].fileUrl.Contains("?")) { fileExtension = item.materials[0].fileUrl.Substring(item.materials[0].fileUrl.LastIndexOf("."), item.materials[0].fileUrl.LastIndexOf("?") - item.materials[0].fileUrl.LastIndexOf(".")).ToLower(); } else { fileExtension = item.materials[0].fileUrl.Substring(item.materials[0].fileUrl.LastIndexOf(".")).ToLower(); } url = outLinePath + "/Main/" + item.materials[0].fileHash + fileExtension; string textContent = DownLoadMethod.ReadContext(url); textContent = textContent.Replace("\r\n", " "); MarqueeControlNew marqueeControlNew = new MarqueeControlNew(); marqueeControlNew.Load(textContent, item.width, item.height, textFontSize, textBackgroundColor, textBackgroundOpacity, textFontColor, textFontStyle, textAnimationSpeed); canvas.Children.Add(marqueeControlNew); marqueeControlNews.Add(marqueeControlNew); Canvas.SetLeft(marqueeControlNew, item.offsetX); Canvas.SetZIndex(marqueeControlNew, item.zIndex); Canvas.SetTop(marqueeControlNew, item.offsetY); } if (item.typeCode == "clock") { var backgroundColor = item.config.Value("backgroundColor"); var fontColor = item.config.Value("fontColor"); var style = item.config.Value("style"); ClockControl clock = new ClockControl(); clock.BindClock(style.Value, item.width, item.height, backgroundColor, fontColor); canvas.Children.Add(clock); clockControls.Add(clock); Canvas.SetLeft(clock, item.offsetX); Canvas.SetZIndex(clock, item.zIndex); Canvas.SetTop(clock, item.offsetY); } if (item.typeCode == "weather") { var backgroundColor = item.config.Value("backgroundColor"); var fontColor = item.config.Value("fontColor"); var style = item.config.Value("style"); var city = item.config.Value("cityName"); if (string.IsNullOrEmpty(city)) { city = app.defaultCity; } if (!string.IsNullOrEmpty(city)) { WeatherControl weather = new WeatherControl(); weather.LoadWeather(city, style.Value, item.width, item.height, backgroundColor, fontColor); canvas.Children.Add(weather); weatherControls.Add(weather); Canvas.SetLeft(weather, item.offsetX); Canvas.SetZIndex(weather, item.zIndex); Canvas.SetTop(weather, item.offsetY); } } if (item.typeCode == "audio" && item.materials != null && item.materials.Count > 0) { MediaPlayer media = new MediaPlayer(); string fileExtension = string.Empty; string url = string.Empty; if (item.materials[0].fileUrl.Contains("?")) { fileExtension = item.materials[0].fileUrl.Substring(item.materials[0].fileUrl.LastIndexOf("."), item.materials[0].fileUrl.LastIndexOf("?") - item.materials[0].fileUrl.LastIndexOf(".")).ToLower(); } else { fileExtension = item.materials[0].fileUrl.Substring(item.materials[0].fileUrl.LastIndexOf(".")).ToLower(); } url = outLinePath + "/Main/" + item.materials[0].fileHash + fileExtension; media.Open(new Uri(url, UriKind.Relative)); media.MediaEnded += (sender, e) => {//播放结束后 又重新播放 media.Position = new TimeSpan(0); }; media.Play(); mediaControls.Add(media); } if (item.typeCode == "html" && item.materials != null && item.materials.Count > 0) { string fileExtension = string.Empty; string url = string.Empty; if (item.materials[0].fileUrl.Contains("?")) { fileExtension = item.materials[0].fileUrl.Substring(item.materials[0].fileUrl.LastIndexOf("."), item.materials[0].fileUrl.LastIndexOf("?") - item.materials[0].fileUrl.LastIndexOf(".")).ToLower(); } else { fileExtension = item.materials[0].fileUrl.Substring(item.materials[0].fileUrl.LastIndexOf(".")).ToLower(); } url = outLinePath + "/Main/" + item.materials[0].fileHash + fileExtension; ChromiumWebBrowser webBrowser = new ChromiumWebBrowser(); webBrowser.Width = item.width; webBrowser.Height = item.height; webBrowser.Address = url.Replace(@"/", @"\").Replace(@"\\",@"\") ; //webBrowser.Address = "file:///D:/360MoveData/Users/jiaxl/Desktop/Websocket.html"; webBrowser.Background = Brushes.Black; Canvas canvas1 = new Canvas(); canvas1.Width = item.width; canvas1.Height = item.height; canvas1.Background = Brushes.White; canvas1.Children.Add(webBrowser); //webBrowser.Load(url); canvas.Children.Add(canvas1); canvasWebBrowsers.Add(canvas1); chromiumWebBrowsers.Add(webBrowser); Canvas.SetLeft(canvas1, item.offsetX); Canvas.SetZIndex(canvas1, item.zIndex); Canvas.SetTop(canvas1, item.offsetY); } if (item.typeCode == "url" && item.materials != null && item.materials.Count > 0 && item.materials[0].mediaInfo != null && !string.IsNullOrEmpty(item.materials[0].mediaInfo.url)) { ChromiumWebBrowser webBrowser = new ChromiumWebBrowser(); webBrowser.Width = item.width; webBrowser.Height = item.height; webBrowser.Address = item.materials[0].mediaInfo.url; webBrowser.Background = Brushes.Black; Canvas canvas1 = new Canvas(); canvas1.Width = item.width; canvas1.Height = item.height; canvas1.Background = Brushes.White; canvas1.Children.Add(webBrowser); //webBrowser.Load(url); canvas.Children.Add(canvas1); canvasWebBrowsers.Add(canvas1); chromiumWebBrowsers.Add(webBrowser); Canvas.SetLeft(canvas1, item.offsetX); Canvas.SetZIndex(canvas1, item.zIndex); Canvas.SetTop(canvas1, item.offsetY); } } } catch (Exception ex) { Class_Log _Log = new Class_Log(); _Log.WriteLogFile(ex.ToString()); } } //private void PlayImage(Image image, List materials, JObject config) //{ // CancellationTokenSource source1 = new CancellationTokenSource(); // cancellationTokens.Add(source1); // CancellationToken token = source1.Token; // TaskFactory factory = new TaskFactory(token); // Task tsk1 = factory.StartNew(() => // { // var curPlayIndex = 0; // var transitionPeriod = config.Value("transitionPeriod"); // var transition = config.Value("transition"); // string fileExtension = string.Empty; // string url = string.Empty; // DateTime? curDate = null; // while (!isStop) // { // if (token.IsCancellationRequested) // { // //isStop = true; // // 释放资源操作等等... // break; // } // if (!curDate.HasValue||curDate.Value.AddMilliseconds(transitionPeriod * 1000) <= DateTime.Now) // { // if (materials[curPlayIndex].fileUrl.Contains("?")) // { // fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf("."), materials[curPlayIndex].fileUrl.LastIndexOf("?") - materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); // } // else // { // fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); // } // curDate = DateTime.Now; // url = outLinePath + "/Main/" + materials[curPlayIndex].fileHash + fileExtension; // BindImage(image, url, transition); // curPlayIndex++; // if (curPlayIndex >= materials.Count) // { // curPlayIndex = 0; // } // } // else // { // Thread.Sleep(1); // } // } // }); // //var thImage = new Thread(new ThreadStart(async () => // //{ // // var curPlayIndex = 0; // // var transitionPeriod = config.Value("transitionPeriod"); // // var transition = config.Value("transition"); // // string fileExtension = string.Empty; // // string url = string.Empty; // // while (!isStop) // // { // // if (materials[curPlayIndex].fileUrl.Contains("?")) // // { // // fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf("."), materials[curPlayIndex].fileUrl.LastIndexOf("?") - materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); // // } // // else // // { // // fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); // // } // // url = outLinePath + "/Main/" + materials[curPlayIndex].fileHash + fileExtension; // // BindImage(image, url, transition); // // curPlayIndex++; // // if (curPlayIndex >= materials.Count) // // { // // curPlayIndex = 0; // // } // // var taskProg = Task.Delay(transitionPeriod * 1000); // // tasks.Add(taskProg); // // await taskProg; // // if (taskProg != null && taskProg.Status != TaskStatus.Canceled) // // { // // taskProg.Dispose(); // // tasks.Remove(taskProg); // // } // // } // //})); // //thImage.IsBackground = true; // //thImage.Start(); //} private void PlayImage(Image image, List materials, JObject config) { CancellationTokenSource source1 = new CancellationTokenSource(); cancellationTokens.Add(source1); CancellationToken token = source1.Token; TaskFactory factory = new TaskFactory(token); Task tsk1 = factory.StartNew(async () => { var curPlayIndex = 0; var transitionPeriod = config.Value("transitionPeriod"); var transition = config.Value("transition"); string fileExtension = string.Empty; string url = string.Empty; DateTime? curDate = null; while (!isStop) { if (token.IsCancellationRequested) { //isStop = true; // 释放资源操作等等... break; } //if (!curDate.HasValue || curDate.Value.AddMilliseconds(transitionPeriod * 1000) <= DateTime.Now) //{ if (materials[curPlayIndex].fileUrl.Contains("?")) { fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf("."), materials[curPlayIndex].fileUrl.LastIndexOf("?") - materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); } else { fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); } curDate = DateTime.Now; url = outLinePath + "/Main/" + materials[curPlayIndex].fileHash + fileExtension; BindImage(image, url, transition); curPlayIndex++; if (curPlayIndex >= materials.Count) { curPlayIndex = 0; } if (token.IsCancellationRequested) { //isStop = true; // 释放资源操作等等... break; } else { await Task.Delay(transitionPeriod * 1000, token); } //} //else //{ // Thread.Sleep(1); //} } }); } private void BindImage(Image image, string img, string transition) { Action action = new Action(()=> { image.Dispatcher.Invoke(new Action(() => { if (img.ToLower().EndsWith(".gif")) { //FileStream stream = new FileStream(img, FileMode.Open, FileAccess.Read); //XamlAnimatedGif.AnimationBehavior.SetSourceStream(image, stream); //FileStream s = new FileStream(outLinePath + "/Main/" + ucList[app.currentIndex].sourceId + fileExtension, FileMode.Open, FileAccess.Read); XamlAnimatedGif.AnimationBehavior.SetSourceUri(image, new Uri(img)); XamlAnimatedGif.AnimationBehavior.SetRepeatBehavior(image, RepeatBehavior.Forever); XamlAnimatedGif.AnimationBehavior.SetAutoStart(image, true); } else { image.Source = new BitmapImage(new Uri(img)); } })); }); action.BeginInvoke(null,null); } private void PlayVideo(VlcControl vlcControl, List materials, JObject config,int type) { Action action = new Action(async delegate { try { Class_Log log = new Class_Log(); //if (th1 == null) //{ CancellationTokenSource source1 = new CancellationTokenSource(); cancellationTokens.Add(source1); CancellationToken token = source1.Token; TaskFactory factory = new TaskFactory(token); Task tsk1 = factory.StartNew(async () => { var curPlayIndex = 0; string fileExtension = string.Empty; string url = string.Empty; var curDate = DateTime.Now; var duration = 0; while (!isStop) { if (token.IsCancellationRequested) { //isStop = true; // 释放资源操作等等... break; } //log.WriteLogFile("-----curDate" + curDate.ToString("yyyy-MM-dd HH:mm:ss") + " url=" + url + " duration=" + duration); //if (curDate.AddMilliseconds(duration) <= DateTime.Now) //{ if (materials[curPlayIndex].fileUrl.Contains("?")) { fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf("."), materials[curPlayIndex].fileUrl.LastIndexOf("?") - materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); } else { fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); } url = outLinePath + "/Main/" + materials[curPlayIndex].fileHash + fileExtension; duration = materials[curPlayIndex].duration; //log.WriteLogFile("curDate" + curDate.ToString("yyyy-MM-dd HH:mm:ss") + " url=" + url + " duration=" + duration); curDate = DateTime.Now; if (type == 1) { vlcVideoPath = url; } else { vlcVideo2Path = url; } StopVideo(vlcControl); StartVideo(vlcControl, url); curPlayIndex++; if (curPlayIndex >= materials.Count) { curPlayIndex = 0; } //var taskProg = Task.Delay(duration); //tasks.Add(taskProg); //await taskProg; //if (taskProg != null && taskProg.Status != TaskStatus.Canceled) //{ // taskProg.Dispose(); // tasks.Remove(taskProg); //} if (token.IsCancellationRequested) { //isStop = true; // 释放资源操作等等... break; } else { await Task.Delay(duration, token); } //} //else //{ // Thread.Sleep(1); //} //Thread.Sleep(duration); } }); //var thVideo = new Thread(new ThreadStart(async () => // { // var curPlayIndex = 0; // string fileExtension = string.Empty; // string url = string.Empty; // while (!isStop) // { // if (materials[curPlayIndex].fileUrl.Contains("?")) // { // fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf("."), materials[curPlayIndex].fileUrl.LastIndexOf("?") - materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); // } // else // { // fileExtension = materials[curPlayIndex].fileUrl.Substring(materials[curPlayIndex].fileUrl.LastIndexOf(".")).ToLower(); // } // url = outLinePath + "/Main/" + materials[curPlayIndex].fileHash + fileExtension; // int duration = materials[curPlayIndex].duration; // StartVideo(vlcControl, url); // curPlayIndex++; // if (curPlayIndex >= materials.Count) // { // curPlayIndex = 0; // } // var taskProg = Task.Delay(duration); // tasks.Add(taskProg); // await taskProg; // if (taskProg != null && taskProg.Status != TaskStatus.Canceled) // { // taskProg.Dispose(); // tasks.Remove(taskProg); // } // //Thread.Sleep(duration); // } // })); //thVideo.IsBackground = true; //thVideo.Start(); //} } catch (Exception ex) { Class_Log log = new Class_Log(); log.WriteLogFile(ex.ToString(), "WindowViewErrorlog"); } }); action.BeginInvoke(null, null); } private void StartVideo(VlcControl vlcControl, string videoPath) { try { vlcControl.SourceProvider.MediaPlayer.Play(new Uri(videoPath)); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void StopVideo(VlcControl vlcControl) { try { if (vlcControl.SourceProvider.MediaPlayer.IsPlaying()) { vlcControl.SourceProvider.MediaPlayer.Pause(); } } catch (Exception e) { MessageBox.Show(e.Message); } } private async void UserControl_Loaded(object sender, RoutedEventArgs e) { } public void Dispose() { try { vlcControl1.Width = 0; vlcControl1.Height = 0; vlcControl2.Width = 0; vlcControl2.Height = 0; isStop = true; foreach (var item in tasks) { if (item != null && (item.IsCanceled || item.IsCompleted || item.IsFaulted)) { item.Dispose(); } } tasks.Clear(); foreach (var item in marqueeControlNews) { item.Dispose(); canvas.Children.Remove(item); } marqueeControlNews.Clear(); foreach (var item in clockControls) { item.Dispose(); canvas.Children.Remove(item); } clockControls.Clear(); foreach (var item in weatherControls) { item.Dispose(); canvas.Children.Remove(item); } weatherControls.Clear(); foreach (var item in cancellationTokens) { item.Cancel(); } cancellationTokens.Clear(); foreach (var item in imageControls) { canvas.Children.Remove(item); } imageControls.Clear(); foreach (var item in mediaControls) { item.Stop(); item.Close(); } mediaControls.Clear(); foreach (var item in chromiumWebBrowsers) { item.Dispose(); canvas.Children.Remove(item); } chromiumWebBrowsers.Clear(); foreach (var item in canvasWebBrowsers) { canvas.Children.Remove(item); } canvasWebBrowsers.Clear(); StopVideo(vlcControl1); StopVideo(vlcControl2); } catch (Exception e) { Class_Log _Log = new Class_Log(); _Log.WriteLogFile(e.ToString(), "prog"); } } } }