2011-09-07 82 views
3

我將應用程序更改爲WPF,它會播放基於時間事件的音頻和視頻以及圖片..我使用了「string MciCommand = string.Format(」play frames FROM {0} {1} {2}「」之前。在特定時間啓動和停止MediaElement

我一直在尋找和努力,現在在WPF C#中解決這個問題

  1. 我有一個視頻(WMV),我有需要多個節 舉例..第1節開始(200ms)停止(250ms)第2節開始(5000ms)停止(15000ms)
  2. 終於我需要它暫停一個靜幀。

我試過使用計時器,並且一個空的while循環,它不正確尋找。 我在虧本媒體元素似乎並不支持這種類型的使用。我想過關於wpfmediakit和直接show很難包裹我的新手wpf技能。

任何幫助,將不勝感激......

回答

2

,這是我怎麼會解決我的問題。我使用的屬性列表,並使用它像一個腳本,我遍歷。如果位置大於結束時間。它會觸發計時器並轉到列表中的下一個項目..還有一些東西可以做得更精緻一些..就像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> 
0

嗯,那對我來說是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 
     } 
    } 

希望這有助於...