C# 在特定时间启动和停止MediaElement

C# 在特定时间启动和停止MediaElement,c#,wpf,video,mediaelement,mci,C#,Wpf,Video,Mediaelement,Mci,我正在将一个应用程序改为WPF,它会根据定时事件播放音频、视频和图片。。之前,我使用了“string MciCommand=string.Format”(“播放从{0}到{1}{2}的帧”) 我一直在搜索并试图在WPF c#中解决这个问题 我有一个视频(wmv),我有多个部分需要一起播放。 示例..第1节启动(200ms)停止(250ms)第2节启动(5000ms)停止(15000ms) 最后我需要它停在静止的画面上 我试过使用一个计时器和一个空的while循环,但它没有正确地寻找。 我不知所措

我正在将一个应用程序改为WPF,它会根据定时事件播放音频、视频和图片。。之前,我使用了“string MciCommand=string.Format”(“播放从{0}到{1}{2}的帧”)

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

  • 我有一个视频(wmv),我有多个部分需要一起播放。 示例..第1节启动(200ms)停止(250ms)第2节启动(5000ms)停止(15000ms)
  • 最后我需要它停在静止的画面上
  • 我试过使用一个计时器和一个空的while循环,但它没有正确地寻找。 我不知所措,媒体元素似乎不支持这种类型的使用。我想到了wpfmediakit,而direct show很难概括我的wpf新手技能


    任何帮助都将不胜感激……

    这就是我最终解决问题的原因。我使用了一个属性列表,并像脚本一样循环使用。如果位置大于结束时间。它将触发计时器并转到列表中的下一项。仍然有一些事情可以改进…就像textbox4 changed事件一样,它也会触发下一个_项,但它完成了任务..目前。。 希望这能帮助有同样问题的人

        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<video_script> script_list = new List<video_script>();
                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<double> 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<double> 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)
        {
    
        }
    
    
    
       }
    }
    

    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    使用系统文本;
    使用System.Windows;
    使用System.Windows.Controls;
    使用System.Windows.Data;
    使用System.Windows.Documents;
    使用System.Windows.Input;
    使用System.Windows.Media;
    使用System.Windows.Media.Imaging;
    使用System.Windows.Navigation;
    使用System.Windows.Shapes;
    使用System.Windows.Media.Animation;
    使用系统组件模型;
    使用系统线程;
    命名空间WpfApplication6
    {
    公共部分类主窗口:窗口
    {
    BackgroundWorker position=新的BackgroundWorker();
    BackgroundWorker test_position=新的BackgroundWorker();
    公共列表脚本_List=新列表();
    国际股票指数;
    公共类视频脚本
    {
    公共字符串操作{get;set;}
    公共时间跨度开始时间{get;set;}
    公共时间跨度结束时间{get;set;}
    公共字符串文件名{get;set;}
    }
    私有无效位置\u DoWork(对象发送方,DoWorkEventArgs e)
    {
    睡眠(100);
    }
    私有无效位置\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
    {
    if(mediaElement1.Position>TimeSpan.fromMillicles(Convert.ToInt32(tb_endtime.Text)))
    {
    下一项();
    }
    else position.RunWorkerAsync();
    textBox4.Text=“播放”;
    textBox3.Text=mediaElement1.Position.ToString();
    }
    公共主窗口()
    {
    初始化组件();
    position.DoWork+=新的DoWorkEventHandler(position_DoWork);
    position.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(position\u RunWorkerCompleted);
    position.workers支持扫描单元=真;
    test_position.DoWork+=新的doworkenthandler(test_position\u DoWork);
    test_position.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(test_position_RunWorkerCompleted);
    test_position.workersupport扫描单元=真;
    }
    私有void Mediasource_单击(对象发送方,路由目标)
    {
    如果(!position.IsBusy)position.RunWorkerAsync();
    mediaElement1.Source=新Uri(tb_filename.Text);
    mediaElement1.LoadedBehavior=System.Windows.Controls.MediaState.Manual;
    mediaElement1.UnloadedBehavior=System.Windows.Controls.MediaState.Manual;
    mediaElement1.ScrubingEnabled=true;
    mediaElement1.Play();
    }
    私有无效停止按钮\单击(对象发送者,路由目标)
    {
    mediaElement1.Stop();
    }
    私有void播放按钮(对象发送者,路由目标e)
    {
    股票指数=0;
    mediaElement1.Play();
    mediaElement1.LoadedBehavior=System.Windows.Controls.MediaState.Manual;
    mediaElement1.UnloadedBehavior=System.Windows.Controls.MediaState.Manual;
    mediaElement1.ScrubingEnabled=true;
    }
    私有无效暂停按钮单击(对象发送器,路由目标)
    {
    如果(mediaElement1.CanPause)
    {
    mediaElement1.Pause();
    }
    }
    私有void AddToListbutton_单击(对象发送者,路由目标)
    {
    视频脚本临时项目=新视频脚本();
    temp_item.filename=tb_filename.Text;
    temp_item.start_time=TimeSpan.fromMillics(转换为32(tb_starttime.Text));
    temp_item.endtime=TimeSpan.frommicles(转换为32(tb_endtime.Text));
    temp_item.action=tb_action.Text;
    脚本列表。添加(临时项目);
    listBox1.Items.Add(temp_item.filename+“|”+tb_starttime.Text+“|”+tb_endtime.Text+“|”+tb_action.Text);
    }
    私有void positionbox_TextChanged(对象发送者,textchangedventargs e)
    {
    if(script_list.Count!=0)
    {
    如果(脚本列表[scrip_index].endtime    <Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="402" Width="922"   WindowStyle="ThreeDBorderWindow">
        <Grid>
        <Button Content="mediasource load" Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="Mediasource_Click" />
        <Button Content="play" Height="23" HorizontalAlignment="Left" Margin="10,43,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="Playbutton_Click" />
        <Button Content="stop" Height="23" HorizontalAlignment="Left" Margin="10,142,0,0" Name="button5" VerticalAlignment="Top" Width="75" Click="stopbutton_Click" />
        <Button Content="Pause" Height="23" HorizontalAlignment="Left" Margin="12,171,0,0" Name="button6" VerticalAlignment="Top" Width="75" Click="pausebutton_Click" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="165,296,0,0" Name="tb_starttime" VerticalAlignment="Top" Width="120"   Text="{Binding ElementName=slider1, Path=Value, Mode=TwoWay}" />
        <TextBox Height="23" HorizontalAlignment="Right" Margin="0,296,426,0" Name="tb_endtime" VerticalAlignment="Top" Width="120" Text="{Binding ElementName=slider2, Path=Value, Mode=TwoWay}" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="630,281,0,0" Name="textBox3" VerticalAlignment="Top" Width="120" TextChanged="positionbox_TextChanged" IsReadOnly="False" Text="{Binding ElementName=mediaElement1, Path=Position.Milliseconds, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="490,281,0,0" Name="textBox4" VerticalAlignment="Top" Width="134" />
        <Label Content="filename" Height="28" HorizontalAlignment="Left" Margin="104,325,0,0" Name="label1" VerticalAlignment="Top" />
        <ListBox Height="215" HorizontalAlignment="Left" Margin="469,10,0,0" Name="listBox1" VerticalAlignment="Top" Width="431" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="165,325,0,0" Name="tb_filename" VerticalAlignment="Top" Width="213" Text="C:\Data\001femod1\vid\dat1.avi" AcceptsTab="False" />
        <Label Content="end time" Height="28" HorizontalAlignment="Left" Margin="291,294,0,0" Name="label2" VerticalAlignment="Top" />
        <Label Content="start time" Height="28" HorizontalAlignment="Left" Margin="104,296,0,0" Name="label3" VerticalAlignment="Top" />
        <Button Content="add to list" Height="23" HorizontalAlignment="Left" Margin="11,315,0,0" Name="button7" VerticalAlignment="Top" Width="75" Click="AddToListbutton_Click" />
        <Label Content="Action" Height="28" HorizontalAlignment="Left" Margin="384,325,0,0" Name="label4" VerticalAlignment="Top" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="434,326,0,0" Name="tb_action" VerticalAlignment="Top" Width="120">
            <ComboBoxItem Content="Play" />
            <ComboBoxItem Content="Load" />
            <ComboBoxItem Content="Stop" />
            <ComboBoxItem Content="Pause" />
            <ComboBoxItem Content="Seek" />
        </ComboBox>
        <Button Content="test times" Height="23" HorizontalAlignment="Left" Margin="50,246,0,0" Name="tb_test" VerticalAlignment="Top" Width="75" Click="testbutton_Click" />
        <Slider Height="23" Margin="147,231,170,0" Name="slider1" VerticalAlignment="Top" SmallChange="1" LargeChange="10" IsSelectionRangeEnabled="False" IsMoveToPointEnabled="True" IsSnapToTickEnabled="True" ValueChanged="slider1_ValueChanged" />
        <Slider Height="23" HorizontalAlignment="Left" Margin="147,260,0,0" Name="slider2" VerticalAlignment="Top" Width="583" SmallChange="1" IsSnapToTickEnabled="True" ValueChanged="slider2_ValueChanged" />
        <Label Content="max value" Height="28" HorizontalAlignment="Left" Margin="736,226,0,0" Name="label5" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="736,247,0,0" Name="tb_slider_maxvalue" VerticalAlignment="Top" Width="120" Text="74000" TextChanged="slidermax_values_TextChanged" />
        <Button Content="start script" Height="23" HorizontalAlignment="Left" Margin="10,281,0,0" Name="button3" VerticalAlignment="Top" Width="75" Click="start_script_Click" />
        <MediaElement Height="215" HorizontalAlignment="Left" Margin="91,10,0,0" Name="mediaElement1" VerticalAlignment="Top" Width="372" MediaOpened="mediaElement1_MediaOpened" />
        </Grid>
        </Window>
    
        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
            }
        }