IBasicVideoEffect 只处理 3 到 8 个第一帧

IBasicVideoEffect processes only form 3 to 8 first frames

我用 MainPage 创建了一个简单的测试 UWP 应用程序,它有 MediaPlayer:

public sealed partial class MainPage
{
    public MainPage()
    {
        InitializeComponent();
        Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        var mediaPlayer = new MediaPlayer
        {
            Source = MediaSource.CreateFromUri(new Uri("ms-appx:///Assets/preview.mp4")),
            AutoPlay = true
        };
        mediaPlayer.AddVideoEffect(typeof(VideoEffect).FullName, true, null);
    }
}

和具有 IBasicVideoEffect 的 WinRT 组件继承了 class,通知我处理了多少帧:

public sealed class VideoEffect : IBasicVideoEffect
{
    public IReadOnlyList<VideoEncodingProperties> SupportedEncodingProperties => new List<VideoEncodingProperties>();

    public bool IsReadOnly => false;

    public MediaMemoryTypes SupportedMemoryTypes => MediaMemoryTypes.Gpu;

    public void SetProperties(IPropertySet configuration) { }

    public bool TimeIndependent => false;

    public void Close(MediaEffectClosedReason reason) { }

    public void DiscardQueuedFrames() { }

    private int _frameCounter;

    public void ProcessFrame(ProcessVideoFrameContext context)
    {
        _frameCounter++;
        Debug.WriteLine("Frame #" + _frameCounter);
    }

    public void SetEncodingProperties(VideoEncodingProperties encodingProperties, IDirect3DDevice device)
    {
        Debug.WriteLine("SetEncodingProperties");
    }
}

如果我 运行 它 - 无论是什么视频文件,都只会处理 3 帧。

如果我在 _frameCounter 增量处设置断点,我将设法按 F5 键 8 帧。

为什么以及如何处理所有帧?

我可以使用 MediaClipMediaComposition 解决它,正如许多例子所说,但在这种情况下,帧由 [=37= 处理] 不是 GPU 视频引擎,这不是我的目标。

这里的问题是您正在播放 MediaPlayer 而没有在 XAML 中显示它。由于媒体未在 UI 上渲染,因此仅处理前几帧,无需处理其他帧。

要使您的 VideoEffect 正常工作,您可以使用 MediaPlayerElement control with MediaPlayerElement.SetMediaPlayer 方法来呈现媒体。

XAML:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <MediaPlayerElement x:Name="mediaPlayerElement" />
</Grid>

Code-behind:

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    var mediaPlayer = new MediaPlayer
    {
        Source = MediaSource.CreateFromUri(new Uri("ms-appx:///Assets/preview.mp4")),
        AutoPlay = true
    };
    mediaPlayer.AddVideoEffect(typeof(VideoEffect).FullName, true, null);

    mediaPlayerElement.SetMediaPlayer(mediaPlayer);
}

在此之后,您会看到 _frameCounter 在媒体播放时增加。

对于 MediaPlayer,您必须在设置源之前添加效果。

effect.AddVideoEffect(_player);
_player.Source = MediaSource.CreateFromMediaStreamSource(source);