MediaComposition 中 MediaClip 的数量问题

Problem with the number of MediaClips in a MediaComposition

我有一个 UWP 桌面应用程序,我在其中使用了包含多个图像的 MediaComposition。但是当我尝试在 MediaComposition 中包含超过五个或六个剪辑时,它不会呈现也不会引发任何异常。欢迎任何帮助。谢谢

<MediaPlayerElement x:Name="mediaPlayerElement" 
                                AutoPlay="False" 
                                Margin="5"
                                Width="640" Height="385"
                                HorizontalAlignment="Center" 
                                AreTransportControlsEnabled="True" />

private async void GenerateClips()
    {
        MediaStreamSource mediaStreamSource;
        var random = new Random();

        var clip1 = MediaClip.CreateFromColor(Colors.AliceBlue, TimeSpan.FromSeconds(36));
        mediaComposition.Clips.Add(clip1);

        for (int i = 0; i < 10; i++)
        {
            GC.Collect();

            var clip2 = MediaClip.CreateFromColor(Color.FromArgb(Convert.ToByte(random.Next(0, 255)),
                Convert.ToByte(random.Next(0, 255)), 
                Convert.ToByte(random.Next(0, 255)), 
                Convert.ToByte(random.Next(0, 255))), 
                TimeSpan.FromSeconds(36)); 

            AddOverlay(mediaComposition, clip2, TimeSpan.FromSeconds(0), 200, 300, 40+(40*i), 40, 1);

        }
       
        mediaStreamSource = mediaComposition.GeneratePreviewMediaStreamSource((int)mediaPlayerElement.ActualWidth, (int)mediaPlayerElement.ActualHeight);
        mediaPlayerElement.Source = MediaSource.CreateFromMediaStreamSource(mediaStreamSource);
    }

private void AddOverlay(MediaComposition mediaComposition, MediaClip overlayMediaClip, TimeSpan delay, double width, double height, double left, double top, double opacity)
    {
        Rect overlayPosition;

        overlayPosition.Width = width;
        overlayPosition.Height = height;
        overlayPosition.X = left;
        overlayPosition.Y = top;

        MediaOverlay mediaOverlay = new MediaOverlay(overlayMediaClip);
        mediaOverlay.Position = overlayPosition;
        mediaOverlay.Opacity = opacity;
        mediaOverlay.Delay = delay;

        MediaOverlayLayer mediaOverlayLayer = new MediaOverlayLayer();
        mediaOverlayLayer.Overlays.Add(mediaOverlay);

        mediaComposition.OverlayLayers.Add(mediaOverlayLayer);
    }

Problem with the number of MediaClips in a MediaComposition

我发现你制作了 10 个 mediaOverlayLayer mediaComposition,这不是很好的做法。更好的方法是将多个 mediaOverlays 插入一个 mediaOverlayLayer 然后将这个 mediaOverlayLayer 插入 mediaComposition.OverlayLayer.

更多请参考以下代码

private MediaComposition mediaComposition;
MediaOverlayLayer mediaOverlayLayer = new MediaOverlayLayer();
private void GenerateClips()
{
    mediaComposition = new MediaComposition();
    MediaStreamSource mediaStreamSource;
    var random = new Random();

    var clip1 = MediaClip.CreateFromColor(Colors.AliceBlue, TimeSpan.FromSeconds(36));
    mediaComposition.Clips.Add(clip1);
    MediaOverlayLayer mediaOverlayLayer = null;
    for (int i = 0; i < 15; i++)
    {             
        var clip2 = MediaClip.CreateFromColor(Color.FromArgb(Convert.ToByte(random.Next(0, 255)),
            Convert.ToByte(random.Next(0, 255)),
            Convert.ToByte(random.Next(0, 255)),
            Convert.ToByte(random.Next(0, 255))),
            TimeSpan.FromSeconds(36));

       mediaOverlayLayer = AddOverlay(mediaComposition, clip2, TimeSpan.FromSeconds(0), 200, 300, 40 + (40 * i), 40, 1);
    }

    mediaComposition.OverlayLayers.Add(mediaOverlayLayer);
    mediaStreamSource = mediaComposition.GeneratePreviewMediaStreamSource((int)mediaPlayerElement.ActualWidth, (int)mediaPlayerElement.ActualHeight);
    mediaPlayerElement.Source = MediaSource.CreateFromMediaStreamSource(mediaStreamSource);
}

private MediaOverlayLayer AddOverlay(MediaComposition mediaComposition, MediaClip overlayMediaClip, TimeSpan delay, double width, double height, double left, double top, double opacity)
{
    Rect overlayPosition;

    overlayPosition.Width = width;
    overlayPosition.Height = height;
    overlayPosition.X = left;
    overlayPosition.Y = top;

    MediaOverlay mediaOverlay = new MediaOverlay(overlayMediaClip);
    mediaOverlay.Position = overlayPosition;
    mediaOverlay.Opacity = opacity;
    mediaOverlay.Delay = delay;      
    mediaOverlayLayer.Overlays.Add(mediaOverlay);
    return mediaOverlayLayer;
}