我将应用程序更改为WPF,它根据定时事件播放音频,视频和图片。我使用“string MciCommand = string.Format(”播放帧从{0}到{1} {2} “”,之前。
我一直在WPF c#
中搜索并尝试解决此问题我尝试过使用计时器和空的while循环,但它没有正确搜索。 我不知道媒体元素似乎不支持这种类型的使用。我想过wpfmediakit和直接展示很难包装我的新手wpf技能。
任何帮助将不胜感激......
答案 0 :(得分:1)
这就是我最终解决问题的方法..我使用了一个属性列表并将其用作我循环的脚本。如果位置大于结束时间。它会触发计时器并转到列表中的下一个项目..仍然有一些事情可以更精确一些..就像textbox4更改事件也触发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>
答案 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
}
}
希望这会有所帮助...