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 帧。
为什么以及如何处理所有帧?
我可以使用 MediaClip 和 MediaComposition 解决它,正如许多例子所说,但在这种情况下,帧由 [=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);
我用 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 帧。
为什么以及如何处理所有帧?
我可以使用 MediaClip 和 MediaComposition 解决它,正如许多例子所说,但在这种情况下,帧由 [=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);