有没有办法在播放多个MediaPlayers实例时减少CPU消耗?

时间:2016-12-27 17:44:27

标签: uwp media-player gpu cpu-usage

我需要使用 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%会进入同步事件。有没有办法减少这些事件?

enter image description here

[编辑]我通过将所有视频替换为RAM并且我的应用停止读取SSD来保存10%的CPU:

    var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/{k}.mp4"));
    var reference = RandomAccessStreamReference.CreateFromFile(file);

现在我正在考虑如何避免RAM并将我的视频直接传递给GPU内存。

有可能吗?

0 个答案:

没有答案