在特定时间启动和停止MediaElement

时间:2011-09-07 16:00:20

标签: c# wpf video mediaelement mci

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

我一直在WPF c#

中搜索并尝试解决此问题
  1. 我有一个视频(wmv),我有多个需要一起播放的部分。  例子.. section1 start(200ms)stop(250ms)section2 start(5000ms)stop(15000ms)
  2. 最后我需要它暂停一个静止的框架..
  3. 我尝试过使用计时器和空的while循环,但它没有正确搜索。 我不知道媒体元素似乎不支持这种类型的使用。我想过wpfmediakit和直接展示很难包装我的新手wpf技能。

    任何帮助将不胜感激......

2 个答案:

答案 0 :(得分:1)

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

enter image description here

    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)
    {

    }



   }
}

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

    <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>

答案 1 :(得分:0)

嗯,这对我来说很重要,所以我会提供一条适合我的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
        }
    }

希望这会有所帮助...