3

我正在将应用程序更改为 WPF,它会根据定时事件播放音频、视频和图片。我使用了 "string MciCommand = string.Format("play frames FROM {0} to {1} {2}"" ,前。

我一直在搜索并尝试在 WPF c# 中解决此问题

  1. 我有一个视频 (wmv),我有多个部分需要一起播放。示例 .. 第 1 节开始(200 毫秒) 停止(250 毫秒) 第 2 节开始(5000 毫秒) 停止(15000 毫秒)
  2. 最后我需要它在静止帧上暂停..

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

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

4

2 回答 2

1

这就是我最终解决问题的方式。我使用了一个属性列表,并像循环使用的脚本一样使用它。如果位置大于结束时间。它触发计时器并转到列表中的下一个项目..还有一些事情可以做得更精致..比如 textbox4 changed 事件也会触发 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<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>
于 2011-09-14T02:25:51.013 回答
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
        }
    }

希望这可以帮助...

于 2017-01-08T14:39:31.533 回答