Reputation: 117
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);
}
Upvotes: 0
Views: 72
Reputation: 32785
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;
}
Upvotes: 1