在特定时间启动和停止MediaElement

我将应用程序更改为WPF,它根据定时事件播放音频,video和图片。我使用“string MciCommand = string.Format(”播放帧从{0}到{1} {2}“”,之前。

我一直在寻找并试图在WPF中解决这个问题c#

  1. 我有一个video(wmv),我有多个部分需要一起播放。 例子.. section1 start(200ms)stop(250ms)section2 start(5000ms)stop(15000ms)
  2. 最后我需要它暂停一个静止的框架..

我试过使用一个计时器,一个空的while循环,它没有正确寻找。 我很茫然媒体元素似乎不支持这种类型的使用。 我想过wpfmediakit和直接展示很难包装我的新手wpf技能。

任何帮助将不胜感激…

这就是我最终解决问题的方法..我使用了一个属性列表并将其用作我循环遍历的脚本。 如果位置大于结束时间。 它会触发计时器并转到列表中的下一个项目..仍然有一些事情可以更精确一些..就像textbox4更改事件也触发next_item但它完成了工作..现在..希望这可以帮助有同样问题的人……

在此处输入图像描述

using System; using System.Collections.Generic; using System.Linq; using System.Text; 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.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Media.Animation; using System.ComponentModel; using System.Threading; namespace WpfApplication6 { public partial class MainWindow : Window { BackgroundWorker position = new BackgroundWorker(); BackgroundWorker test_position = new BackgroundWorker(); public List script_list = new List(); int scrip_index; public class video_script { public string action { get; set; } public TimeSpan start_time { get; set; } public TimeSpan endtime { get; set; } public string filename { get; set; } } private void position_DoWork(object sender, DoWorkEventArgs e) { Thread.Sleep(100); } private void position_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (mediaElement1.Position > TimeSpan.FromMilliseconds(Convert.ToInt32(tb_endtime.Text))) { next_item(); } else position.RunWorkerAsync(); textBox4.Text = "Play"; textBox3.Text = mediaElement1.Position.ToString(); } public MainWindow() { InitializeComponent(); position.DoWork += new DoWorkEventHandler(position_DoWork); position.RunWorkerCompleted += new RunWorkerCompletedEventHandler(position_RunWorkerCompleted); position.WorkerSupportsCancellation = true; test_position.DoWork += new DoWorkEventHandler(test_position_DoWork); test_position.RunWorkerCompleted += new RunWorkerCompletedEventHandler(test_position_RunWorkerCompleted); test_position.WorkerSupportsCancellation = true; } private void Mediasource_Click(object sender, RoutedEventArgs e) { if (!position.IsBusy) position.RunWorkerAsync(); mediaElement1.Source = new Uri(tb_filename.Text); mediaElement1.LoadedBehavior = System.Windows.Controls.MediaState.Manual; mediaElement1.UnloadedBehavior = System.Windows.Controls.MediaState.Manual; mediaElement1.ScrubbingEnabled = true; mediaElement1.Play(); } private void stopbutton_Click(object sender, RoutedEventArgs e) { mediaElement1.Stop(); } private void Playbutton_Click(object sender, RoutedEventArgs e) { scrip_index = 0; mediaElement1.Play(); mediaElement1.LoadedBehavior = System.Windows.Controls.MediaState.Manual; mediaElement1.UnloadedBehavior = System.Windows.Controls.MediaState.Manual; mediaElement1.ScrubbingEnabled = true; } private void pausebutton_Click(object sender, RoutedEventArgs e) { if (mediaElement1.CanPause) { mediaElement1.Pause(); } } private void AddToListbutton_Click(object sender, RoutedEventArgs e) { video_script temp_item = new video_script(); temp_item.filename = tb_filename.Text; temp_item.start_time = TimeSpan.FromMilliseconds(Convert.ToInt32(tb_starttime.Text)); temp_item.endtime = TimeSpan.FromMilliseconds(Convert.ToInt32(tb_endtime.Text)); temp_item.action = tb_action.Text; script_list.Add(temp_item); listBox1.Items.Add(temp_item.filename + " | " + tb_starttime.Text + " | " + tb_endtime.Text + " | " + tb_action.Text); } private void positionbox_TextChanged(object sender, TextChangedEventArgs e) { if (script_list.Count != 0) { if (script_list[scrip_index].endtime < mediaElement1.Position) next_item(); } } #region test button area private void next_item() { if (scrip_index < script_list.Count() - 1) { scrip_index++; switch (script_list[scrip_index].action) { case "Load": mediaElement1.LoadedBehavior = System.Windows.Controls.MediaState.Manual; mediaElement1.UnloadedBehavior = System.Windows.Controls.MediaState.Manual; if (mediaElement1.Source != new Uri(script_list[scrip_index].filename)) mediaElement1.Source = new Uri(script_list[scrip_index].filename); mediaElement1.ScrubbingEnabled = true; playing = false; next_item(); break; case "Play": mediaElement1.Play(); playing = true; if(!test_position.IsBusy) test_position.RunWorkerAsync(); break; case "Pause": mediaElement1.Pause(); playing = false; break; case "Seek": mediaElement1.Position = script_list[scrip_index].start_time; playing = true; break; case "Stop": mediaElement1.Stop(); playing = false; break; } } } private void test_position_DoWork(object sender, DoWorkEventArgs e) { Thread.Sleep(100); } private void test_position_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (mediaElement1.Position > script_list[scrip_index].endtime ) { next_item(); } else test_position.RunWorkerAsync(); textBox4.Text = "Play"; textBox3.Text = mediaElement1.Position.ToString(); if (playing && !test_position.IsBusy) test_position.RunWorkerAsync(); } private void testbutton_Click(object sender, RoutedEventArgs e) { if (mediaElement1.Source != new Uri(tb_filename.Text)) mediaElement1.Source = new Uri(tb_filename.Text); mediaElement1.LoadedBehavior = System.Windows.Controls.MediaState.Manual; mediaElement1.UnloadedBehavior = System.Windows.Controls.MediaState.Manual; mediaElement1.Play(); mediaElement1.ScrubbingEnabled = true; mediaElement1.Position = TimeSpan.FromMilliseconds(Convert.ToInt32(tb_starttime.Text)); if (test_position.IsBusy) test_position.CancelAsync(); if (!test_position.IsBusy) test_position.RunWorkerAsync(); } bool playing; #endregion #region slider region private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (slider1.Value > slider2.Value) slider2.Value = slider1.Value - 1; } private void slidermax_values_TextChanged(object sender, TextChangedEventArgs e) { slider1.Maximum = Convert.ToInt32(tb_slider_maxvalue.Text); slider2.Maximum = Convert.ToInt32(tb_slider_maxvalue.Text); } private void slider2_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (slider2.Value < slider1.Value) slider1.Value = slider2.Value - 1; } #endregion private void start_script_Click(object sender, RoutedEventArgs e) { scrip_index = -1; next_item(); } private void mediaElement1_MediaOpened(object sender, RoutedEventArgs e) { } } } 

这是我用于测试的表单的Xaml ....

                                   

嗯,这对我来说是这样的,所以我会提供一条适合我的UWP项目的路线,看起来更简单,但不确定它是否适用于你的情况:

要跳到正确的位置,请使用MediaPlayer.PlaybackSession.Position = TimeSpan.FromMilliseconds( yourDesiredPosition );

要知道何时跳到正确的位置(或做任何你需要的,开始,停止,切换源,等等),只需附加一个位置更改事件:

  Player.MediaPlayer.PlaybackSession.PositionChanged += PlaybackSession_PositionChanged; private void PlaybackSession_PositionChanged(MediaPlaybackSession sender, object args) { var playa = sender.MediaPlayer; if(playa.Position >= YourSpecialTimeSpan) { //do something, note can check state with sender.PlaybackState } } 

希望这可以帮助…