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;
}
我有一个 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;
}