gpt4 book ai didi

c# - 使用 MediaElement + Storyboard 连续播放视频

转载 作者:行者123 更新时间:2023-11-30 16:11:36 26 4
gpt4 key购买 nike

我有一个连续录制的视频文件的时间轴。我需要在我的应用程序中以相同的顺序播放它们。

  1. 我已经知道每个视频的相对开始时间和持续时间。
  2. 下一个视频可能要等到上一个视频停止录制几秒、几分钟甚至几小时后才开始录制。
  3. 我需要某种位置更改通知,以便我可以将其他 UI 元素同步到视频位置(例如图表)。
  4. 在没有录制视频的部分,视频窗口将显示空白屏幕。
  5. 不幸的是,我现在一直在使用 WinForms,但我在 ElementHost 中嵌入了一个 MediaElement

MediaTimeline + Storyboard 组合似乎很适合我的需要。 Storyboard 提供了满足条件 3 的 CurrentTimeInvalidated 事件。至于条件 1 和 2,我相信我可以为每个视频创建一个 MediaTimeline 并且在 Storyboard 中添加它们中的每一个作为 child 。看起来我已经部分工作了,但仍然有一些问题。

在我目前的实现中, Storyboard 从头到尾播放得很好。但是,视频只会显示添加到 Storyboard 中的最后一个视频。

这是我要实现的视频时间轴播放器的一些简化伪代码。

public class VideoTimelineEntry
{
public Uri Uri;
public TimeSpan RelativeStartTime;
public TimeSpan Duration;
}

public class VideoTimelinePlayer : System.Windows.Forms.UserControl
{
private MediaElement _mediaElement = ...; // Contained in ElementHost
private Storyboard _storyboard = new Storyboard();

public void LoadTimeline(IEnumerable<VideoTimelineEntry> entries)
{
foreach (VideoTimelineEntry entry in entries)
{
MediaTimeline mediaTimeline = new MediaTimeline
{
BeginTime = entry.RelativeStartTime,
Duration = new Duration(entry.Duration),
Source = entry.Uri
};

_storyboard.Children.Add(mediaTimeline);

// I think this is my problem. How do I set the target
// so that it is always playing the current video, and
// not just the last one in my timeline?
Storyboard.SetTarget(mediaTimeline, _mediaElement);
}
}

public void Play()
{
_storyboard.Begin();
}

public void Pause()
{
_storyboard.Pause();
}

public void Stop()
{
_storyboard.Stop();
}
}

如有任何帮助,我们将不胜感激。

最佳答案

您似乎只能针对每个 MediaTimeline 定位 1 个 MediaElement。作为变通方法,我现在为每个 MediaTimeline 创建一个专用的 MediaElement。在我看来,这不是一个好的解决方案,但我想不出更好的方法,除非我想处理轮询/定时和动态更改视频源。但是,我使用 Storyboard 的全部原因是为了避免这样做。

2014 年 7 月 24 日更新

我决定发布一个非常淡化的示例来改进这个答案。

public void LoadTimeline(IEnumerable<MediaTimeline> mediaTimelines)
{
// Check that none of the timelines overlap as specified by the
// acceptance criteria.
// e.g. timeline2.BeginTime < timeline1.BeginTime + timeline1.Duration.

_storyboard.Children.Clear();

foreach (MediaTimeline mediaTimeline in mediaTimelines)
{
_storyboard.Children.add(mediaTimeline);

MediaElement mediaElement = new MediaElement();

// _grid is just an empty <Grid></Grid> in the xaml layer.
_grid.Children.Add(mediaElement);

// Each media timeline now targets a dedicated media element.
Storyboard.SetTarget(mediaTimeline, mediaElement);

// Bring the active media element to the top.
mediaTimeline.CurrentStateInvalidated += (sender, args) =>
{
Panel.SetZIndex(mediaElement, int.MaxValue);
};
}
}

关于c# - 使用 MediaElement + Storyboard 连续播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24245501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com