C# IBasicVideoEffect处理仅形成3到8个第一帧

C# IBasicVideoEffect处理仅形成3到8个第一帧,c#,windows-runtime,uwp,media-player,video-effects,C#,Windows Runtime,Uwp,Media Player,Video Effects,我创建了一个简单的测试UWP应用程序,其中有一个主页,它有MediaPlayer: public sealed partial class MainPage { public MainPage() { InitializeComponent(); Loaded += MainPage_Loaded; } private void MainPage_Loaded(object sender, RoutedEventArgs e)

我创建了一个简单的测试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);
    }
}
和WinRT组件,该组件具有IBasicVideoEffect继承的类,该类通知我处理了多少帧:

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");
    }
}
公共密封类VideoEffect:IBasicVideoEffect
{
公共IReadOnlyList SupportedEncodingProperties=>new List();
公共bool IsReadOnly=>false;
公共MediaMemoryTypes SupportedMemoryTypes=>MediaMemoryTypes.Gpu;
公共void集合属性(IPropertySet配置){}
公共bool TimeIndependent=>false;
公共无效关闭(MediaEffectClosedReason原因){}
public void丢弃队列框架(){}
专用整数帧计数器;
公共无效ProcessFrame(ProcessVideoFrameContext上下文)
{
_帧计数器++;
Debug.WriteLine(“Frame#”+_frameCounter);
}
公共void SetEncodingProperties(VideoEncodingProperties encodingProperties,IDirect3DDevice)
{
Debug.WriteLine(“SetEncodingProperties”);
}
}
如果我运行它-只有3帧将被处理,无论什么视频文件将

如果我在\u frameCounter递增的位置设置断点,我将设法在8帧中按F5键

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


正如许多例子所说,我可以使用MediaClipMediaComposition解决这个问题,但是在这种情况下,帧是由CPU而不是GPU视频引擎处理的,这不是我的目标。

这里的问题是,您在播放一个视频时没有在XAML中显示它。因此,只处理了前几个帧,因为媒体没有在UI上渲染,所以不需要处理其他帧

要使您的
VideoEffect
工作,您可以使用control with方法渲染媒体

XAML:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <MediaPlayerElement x:Name="mediaPlayerElement" />
</Grid>
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);
}

之后,您将看到播放媒体时帧计数器增加。

使用MediaPlayer,您必须在设置源之前添加效果

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