我正在使用
MediaComposition
创建已编辑的视频。
结果应该是这样的:
https://www.youtube.com/watch?v=cFEkkQIYGBc
private async Task ExportFrames(IEnumerable<OverlayFrame> frames, IStorageFile inputFile,
IStorageFile outputFile)
{
var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Test", CreationCollisionOption.ReplaceExisting);
var composition = new MediaComposition();
foreach (var frame in frames)
{
var render = new RenderTargetBitmap();
control.DataContext = convertFunc(frame.Status);
await render.RenderAsync(control);
var pixel = await render.GetPixelsAsync();
var file = await folder.CreateFileAsync("overlay.png", CreationCollisionOption.GenerateUniqueName);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)render.PixelWidth,
(uint)render.PixelHeight,
logicalDpi,
logicalDpi,
pixel.ToArray());
await encoder.FlushAsync();
stream.Dispose();
var clip = await MediaClip.CreateFromImageFileAsync(file, frame.Duration);
AddOverlay(composition, clip, 0, 0, control.ActualWidth, control.ActualHeight);
}
}
var originalVideo = await MediaClip.CreateFromFileAsync(inputFile);
composition.Clips.Add(originalVideo);
await composition.RenderToFileAsync(outputFile, MediaTrimmingPreference.Precise);
await folder.DeleteAsync();
}
private void AddOverlay(MediaComposition composition, MediaClip overlayMediaClip, double left, double top, double width, double height)
{
var overlayPosition = new Rect(left, top, width, height);
var mediaOverlay = new MediaOverlay(overlayMediaClip)
{
Position = overlayPosition,
};
var mediaOverlayLayer = new MediaOverlayLayer();
mediaOverlayLayer.Overlays.Add(mediaOverlay);
composition.OverlayLayers.Add(mediaOverlayLayer);
}
在
foreach
我生成了一个对应于覆盖信息的png文件。它是使用来自UI中控件的RenderTargetBitmap生成的。
inputFile
)
问题是生成的视频只显示原始视频。上面没有覆盖层。
我做错了什么?