我需要使用 MediaPlayer 和 Composition API 同时播放15个轻量级视频。
所以我创建了一个简单的 UWP 应用:
public sealed partial class MainPage
{
public MainPage()
{
InitializeComponent();
Loaded += MainPage_Loaded;
}
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
var compositor = ElementCompositionPreview.GetElementVisual(MainGrid).Compositor;
var container = compositor.CreateContainerVisual();
var k = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++, k++)
{
var mediaPlayer = new MediaPlayer
{
Source = new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri($"ms-appx:///Assets/{k}.mp4"))),
AutoPlay = true,
IsMuted = true,
IsLoopingEnabled = true,
RealTimePlayback = true
};
mediaPlayer.SetSurfaceSize(new Size(512, 512));
var surfaceBrush = compositor.CreateSurfaceBrush(mediaPlayer.GetSurface(compositor).CompositionSurface);
var sprite = compositor.CreateSpriteVisual();
sprite.Size = new Vector2(512, 512);
sprite.Offset = new Vector3(512 * j, 512 * i, 0);
sprite.Brush = surfaceBrush;
container.Children.InsertAtTop(sprite);
}
}
ElementCompositionPreview.SetElementChildVisual(MainGrid, container);
}
}
CPU上升到25%,GPU上升约30%。 (CPU - i7 4770,GPU - nVidia GTX 970)
不应该让GPU完成所有工作,有没有办法让CPU平静下来?或者是否有其他方法可以在CPU使用率较低的情况下播放 UWP 中的许多视频?
所有视频均为512x512px 60fps h264 * .mp4,每张约10MB。
试图使用15个VLC实例 - 结果是100%的CPU。还尝试了很多不同的编解码器 - 没用。
[编辑]
我使用Concurrency Vizualizer运行我的应用程序,发现虽然硬件GPU解码器没有超载,但98%会进入同步事件。有没有办法减少这些事件?
[编辑]我通过将所有视频替换为RAM并且我的应用停止读取SSD来保存10%的CPU:
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/{k}.mp4"));
var reference = RandomAccessStreamReference.CreateFromFile(file);
现在我正在考虑如何避免RAM并将我的视频直接传递给GPU内存。
有可能吗?