Запускать и останавливать MediaElement в определенное время - PullRequest
3 голосов
/ 07 сентября 2011

Я изменил приложение на WPF, оно воспроизводит аудио, видео и изображения, основанные на временных событиях .. Я использовал "string MciCommand = string.Format (" воспроизводить кадры ОТ {0} до {1} {2}"", раньше.

Я искал и пытался исправить эту проблему сейчас в WPF c #

  1. У меня есть видео (wmv), и у меня есть несколько разделов, которые необходимовоспроизводится вместе. пример .. начало секции (200 мс) остановка (250 мс) начало секции 2 (5000 мс) остановка (15000 мс)
  2. наконец, мне нужно сделать паузу на неподвижном кадре ..

Я пытался использовать таймер и пустой цикл while, и он не ищет должным образом. Я в затруднении, медиа-элемент, кажется, не поддерживает этот тип использования. Я думал о wpfmediakit и прямом шоу очень труднооберните мои навыки начинающего wpf.

любая помощь будет принята с благодарностью ...

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

так я и решил свою проблему ... Я использовал список свойств и использовал его как скрипт, который я перебираю.и если позиция больше, чем время окончания.он запускает таймер и переходит к следующему элементу в списке ... есть еще кое-что, что можно сделать немного более изысканным ... например, событие textbox4 change также запускает 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>
0 голосов
/ 08 января 2017

Хммм, это был tldnr для меня, поэтому я предложу маршрут, который работал для меня для проекта 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
        }
    }

надеюсь, это поможет ...

...