WPF MediaElement怎么播放指定的间隔的视频

咋了啦 2011-09-21 07:06:24
比如我有一个视频,总共40s,现在我希望播放10s -- 20s 下次我希望播放20s - 30秒

怎么实现,大家有办法么?
...全文
581 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Crazylight 2012-01-30
  • 打赏
  • 举报
回复
控件没有每隔几秒调用一次的事件,好象只能用Timer了
Crazylight 2012-01-30
  • 打赏
  • 举报
回复
学习参考
咋了啦 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 li_007 的回复:]
引用 16 楼 sanjiawan 的回复:

引用 14 楼 li_007 的回复:
引用 12 楼 sanjiawan 的回复:

前台加上一个属性 LoadedBehavior
HTML code
<MediaElement LoadedBehavior="Manual" />


C# code

MediaClock mc;
int judge = 0;
pr……
[/Quote]

打错自己了,是说一个程序里面timer太多,担心引起混乱的。
咋了啦 2011-09-23
  • 打赏
  • 举报
回复

[Quote=引用 16 楼 sanjiawan 的回复:]

引用 14 楼 li_007 的回复:
引用 12 楼 sanjiawan 的回复:

前台加上一个属性 LoadedBehavior
HTML code
<MediaElement LoadedBehavior="Manual" />


C# code

MediaClock mc;
int judge = 0;
private void MediaTimeline_……
[/Quote]

谢谢你的回答,我已经用timer来实现了,效果也不错的。

原因还是在于我自己的。在timeline的情况,我们无法控制,这个具体看msdn。

是我自己不想去写timer,因为我代码里面有几个timer了,我担心写错了timer会出现问题。
咋了啦 2011-09-22
  • 打赏
  • 举报
回复
在没人帮我看看的?
咋了啦 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sanjiawan 的回复:]

前台加上一个属性 LoadedBehavior
HTML code
<MediaElement LoadedBehavior="Manual" />


C# code

MediaClock mc;
int judge = 0;
private void MediaTimeline_CurrentTimeInvalidated(object send……
[/Quote]

就是用MediaClock.Controller.seek的时候,从MediaElement获得的Clock的Controller为null,不知道为什么?
咋了啦 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sanjiawan 的回复:]

前台加上一个属性 LoadedBehavior
HTML code
<MediaElement LoadedBehavior="Manual" />


C# code

MediaClock mc;
int judge = 0;
private void MediaTimeline_CurrentTimeInvalidated(object send……
[/Quote]

首先谢谢你的回答,但是我在你的代码中做了如下添加

private void btn2_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Before Position = " + mediaElement.Position);
mediaElement.Position += TimeSpan.FromSeconds(20);
Debug.WriteLine("After Position = " + mediaElement.Position);


mediaElement1.Clock = mc; //点击该按钮 接着播放视频
mediaElement1.Play();
}


但是视频并没有seek到20秒开始播放的。为什么,

如果用MediaClock.Controller.seek,又报错。
sanjiawan 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 li_007 的回复:]
引用 12 楼 sanjiawan 的回复:

前台加上一个属性 LoadedBehavior
HTML code
<MediaElement LoadedBehavior="Manual" />


C# code

MediaClock mc;
int judge = 0;
private void MediaTimeline_CurrentTimeInvalidated……
[/Quote]
楼主 这里有个链接里面的内容挺全的 希望可以帮到你
我看了下里面的内容 这是暂停和继续 和你写的代码是一样的 如果这篇文章的内容都是对的 唯一的可能是你前台的代码和后台有冲突了 导致设置失败 你仔细研究下吧
http://hi.baidu.com/6pingm/blog/item/437c580d85d86bc77bcbe1ff.html/cmtid/91b3047054d984128701b01a
sanjiawan 2011-09-22
  • 打赏
  • 举报
回复
前台加上一个属性 LoadedBehavior
 <MediaElement LoadedBehavior="Manual" />



MediaClock mc;
int judge = 0;
private void MediaTimeline_CurrentTimeInvalidated(object sender, EventArgs e)
{
if (mediaElement1.Position.Seconds == 5)
{
if (judge == 0)
{
judge = 1;
mc = mediaElement1.Clock;
mediaElement1.Clock = null;
mediaElement1.Pause();
MessageBox.Show("视频播放已经5秒了"); //视频播放到5秒暂停
}
}
}
private void btn2_Click(object sender, RoutedEventArgs e)
{
mediaElement1.Clock = mc; //点击该按钮 接着播放视频
mediaElement1.Play();
}
private void btn1_Click(object sender, RoutedEventArgs e)
{
mediaElement1.Pause(); //单击该按钮暂停视频
}
咋了啦 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sanjiawan 的回复:]

你试试
HTML code
<MediaElement Height="120" HorizontalAlignment="Left" Margin="152,49,0,0" Name="mediaElement1" MediaOpened="mediaElement1_MediaOpened" VerticalAlignment="Top" Width="160">
……
[/Quote]

9楼的你能控制听下来么
咋了啦 2011-09-21
  • 打赏
  • 举报
回复

<Window x:Class="WpfMediaElementControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="711" Width="625">

<Grid>
<MediaElement Name="myMediaElement" Width="598" Height="460" LoadedBehavior="Manual" Canvas.Left="0" Canvas.Top="0">
<MediaElement.Triggers>
<EventTrigger RoutedEvent="MediaElement.Loaded">
<EventTrigger.Actions>
<BeginStoryboard Name="myBegin" >
<Storyboard Name="sb" SlipBehavior="Slip" >
<MediaTimeline Source="Medias\Maps.mp4" BeginTime="0:0:0" Duration="0:1:30"
Storyboard.TargetName="myMediaElement" CurrentTimeInvalidated="MediaTimeChanged"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</MediaElement.Triggers>
</MediaElement>

<Button Content="Stop" Height="23" HorizontalAlignment="Left" Margin="85,597,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>



private void MediaTimeChanged(object sender, EventArgs e)
{
//Debug.WriteLine(myMediaElement.Position.TotalMilliseconds + " " + myMediaElement.Position.TotalSeconds);

if (!isPause)
{
//Debug.WriteLine(" --> " + (myMediaElement.Position.TotalMilliseconds - 10000));
if ((myMediaElement.Position.TotalMilliseconds - 10000) < 100 &&
(myMediaElement.Position.TotalMilliseconds - 10000) > 0)
{
myMediaElement.Pause();

isPause = true;
}
}
}

private void button1_Click(object sender, RoutedEventArgs e)
{
myMediaElement.Pause();

sb.Pause();

myBegin.Storyboard.Pause();
}


我像上面这样做了,但是我无法停止下来的,Pause函数执行无效啊。
sanjiawan 2011-09-21
  • 打赏
  • 举报
回复
你试试
<MediaElement Height="120" HorizontalAlignment="Left" Margin="152,49,0,0" Name="mediaElement1" MediaOpened="mediaElement1_MediaOpened" VerticalAlignment="Top" Width="160">
<MediaElement.Triggers>
<EventTrigger>
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<MediaTimeline Source="视频路径" Storyboard.TargetName="mediaElement1" CurrentTimeInvalidated="MediaTimeline_CurrentTimeInvalidated"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</MediaElement.Triggers>
</MediaElement>



private void MediaTimeline_CurrentTimeInvalidated(object sender, EventArgs e)
{
if (mediaElement1.Position.Seconds == 20)
{
MessageBox.Show("视频播放已经20秒了");
}
}
  • 打赏
  • 举报
回复
呵呵如果你对20s特别想“不停比较”,那么干脆在 CurrentStateChanged 事件中判断状态为 Playing 之后只是启动一个阻塞19s的DispatcherTimer好了,然后19s之后你才按照你说的每隔几十毫秒就“不停比较”、判断 Position 也可以。

Positon 属性是既可以写,也可以读的。
sanjiawan 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sp1234 的回复:]
就是每一次播放的起点不同。
[/Quote]
还是不太懂 希望楼主说清楚 你是想 看到20秒自动停掉? 还是自己点击暂停按钮 和继续按钮? 还是视频关闭后 打开再接着上次的那个时间看?
咋了啦 2011-09-21
  • 打赏
  • 举报
回复
恩,播放起点我们可以设置position,但是怎么暂停是个问题。比如说现在需要从10秒播放到20秒,问题是怎么来判断依据播放到了20秒?
  • 打赏
  • 举报
回复
就是每一次播放的起点不同。
sanjiawan 2011-09-21
  • 打赏
  • 举报
回复
什么叫 现在我希望播放10s -- 20s 下次我希望播放20s - 30秒
  • 打赏
  • 举报
回复
不需要“不停比较”啊!一个DispacherTimer,只需要触发一次就可以了。你可以对其进行Pause()或者Stop()操作。
咋了啦 2011-09-21
  • 打赏
  • 举报
回复
我知道设置position,但是怎么判断播放到了20s呢,难道另外再写一个timer去不停比较?????
  • 打赏
  • 举报
回复

17,747

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧