代码之家  ›  专栏  ›  技术社区  ›  SuperJMN

如何在UWP中创建覆盖视频?

  •  1
  • SuperJMN  · 技术社区  · 6 年前

    我正在使用 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 )

    问题是生成的视频只显示原始视频。上面没有覆盖层。

    我做错了什么?

    0 回复  |  直到 6 年前