Search code examples
c#uwpmedia-player

Problem with the number of MediaClips in a MediaComposition


I have a UWP Desktop application in which I use a MediaComposition with multiple images. But when I try to include more than five or six clips in MediaComposition, it doesn't render and doesn't throw any exceptions. Any help is most welcome. Thanks.

<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);
    }

Solution

  • Problem with the number of MediaClips in a MediaComposition

    I found you have make 10 mediaOverlayLayer mediaComposition, it it not good practice. the better way is insert multiple mediaOverlays into one mediaOverlayLayer then insert this mediaOverlayLayer into mediaComposition.OverlayLayer.

    For more please refer the following code.

    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;
    }