Создание видео из элементов управления пользовательского интерфейса в UWP с использованием Composition - PullRequest
0 голосов
/ 11 октября 2018

Я создаю приложение, которое берет видео и накладывает данные датчика с дрона.

Пожалуйста, посмотрите его в действии здесь:

https://youtu.be/eAOjImJci3M

Но это не редактирует видео, оно только в приложении.

Моя цель - создать новое видео с наложенными на него данными.Как я могу захватить элемент пользовательского интерфейса с течением времени и сделать из него MediaClip?

Спасибо!

1 Ответ

0 голосов
/ 15 октября 2018

Краткий ответ : сделать снимок экрана пользовательского интерфейса с определенным интервалом, а затем накопить его для создания видео:

длинный ответ : назовем имяПользовательский интерфейс, который вы хотите записать как myGrid, чтобы получить снимки экрана с интервалом, вы можете использовать DispatcerTimer и обрабатывать событие Tick следующим образом:

private async void Tm_Tick(object sender, object e)
{
    RenderTargetBitmap rendertargetBitmap = new RenderTargetBitmap();
    await rendertargetBitmap.RenderAsync(myGrid);
    var bfr = await rendertargetBitmap.GetPixelsAsync();

    CanvasRenderTarget rendertarget = null
    using (CanvasBitmap canvas = CanvasBitmap.CreateFromBytes(CanvasDevice.GetSharedDevice(), bfr, rendertargetBitmap.PixelWidth, rendertargetBitmap.PixelHeight, Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalized))
    {
        rendertarget = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), canvas.SizeInPixels.Width, canvas.SizeInPixels.Height, 96);
        using (CanvasDrawingSession ds = rendertarget.CreateDrawingSession())
        {
            ds.Clear(Colors.Black);
            ds.DrawImage(canvas);
        }
    }
    MediaClip m = MediaClip.CreateFromSurface(rendertarget, TimeSpan.FromMilliseconds(80));
    mc.Clips.Add(m);
}

mc - это MediaComposition объект, который я объявил ранее.

Когда вы закончите запись, остановите DispatcherTimer и сохраните видео на диск следующим образом:

tm.Stop();
await mc.RenderToFileAsync(file, MediaTrimmingPreference.Precise, MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Vga));

tm - это DispatcherTimerЯ объявил ранее, и file - это StorageFile с расширением mp4.

Эта процедура не требует сохранения каждого снимка экрана на диск.

Если выИнтересно, почему я использовал дополнительный CanvasRenderTarget, это из-за этой проблемы.

Надеюсь, что поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...