我在WPF工作并创建一个库文件夹,我想在系统中的文件夹中显示视频的视频缩略图。我在C#中编写了以下代码来获取视频缩略图。
private BitmapSource RenderThumb(Uri uri)
{
var player = new MediaPlayer { Volume = 0, ScrubbingEnabled = true };
player.Open(uri);
Thread.Sleep(3000);
player.Pause();
player.Position = player.NaturalDuration.HasTimeSpan
? TimeSpan.FromSeconds(player.NaturalDuration.TimeSpan.TotalSeconds / 2)
: TimeSpan.FromSeconds(2);
int width = player.NaturalVideoWidth;
int height = player.NaturalVideoHeight;
if (width == 0 || height == 0)
{
throw new InvalidOperationException("Width or Height cannot be 0");
}
var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
var dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
dc.DrawVideo(player, new Rect(0, 0, width, height));
}
player.Close();
rtb.Render(dv);
Freezable frame = BitmapFrame.Create(rtb).GetCurrentValueAsFrozen();
Freezable smallerFrame =
BitmapFrame.Create(new TransformedBitmap(source: frame as BitmapSource, newTransform: new ScaleTransform(0.5, 0.5))).
GetCurrentValueAsFrozen();
return smallerFrame as BitmapSource;
}
然而,如果我尝试加载10个视频的缩略图,那么我每次都会获得2个3个视频的空白/黑色缩略图,而其他所有视频的加载都很好。这种行为是随机的,有时我得到最后3个视频的空白缩略图,有时前3个视频,所以我不知道在哪里寻找我的问题的解决方案。我尝试查看BitmapSource
的属性,但所有10个视频的属性在调试器中都具有相同的信息。
答案 0 :(得分:0)
渲染后在函数底部移动player.Close();
为我解决了问题。