C# IBasicVideoEffect处理仅形成3到8个第一帧
我创建了一个简单的测试UWP应用程序,其中有一个主页,它有MediaPlayer: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)
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键
为什么以及如何处理所有帧
正如许多例子所说,我可以使用MediaClip和MediaComposition解决这个问题,但是在这种情况下,帧是由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);