Добавление текста к видео кадры


В настоящее время я пытаюсь добавить текст к видео. Для этого я манипулирую каждого кадра, добавление текста к каждой Bitmap и затем рендеринг нового видео.

using (var vFReader = new VideoFileReader())
{
    vFReader.Open(HostingEnvironment.MapPath("~/Content/images/video.mp4"));

    using (var vFWriter = new VideoFileWriter())
    {
        vFWriter.Open(HostingEnvironment.MapPath($"~/Content/videos/{id}.mp4"), vFReader.Width, vFReader.Height, vFReader.FrameRate, VideoCodec.H264, vFReader.BitRate);

        for (var i = 0; i < vFReader.FrameCount; i++)
        {
            var image = vFReader.ReadVideoFrame();

            var graphics = Graphics.FromImage(image);

            graphics.SmoothingMode = SmoothingMode.AntiAlias;

            graphics.DrawString(facebookUser?.FirstName, font, Brushes.White, new Point(vFReader.Width / 2, 75), format);
            //graphics.DrawString("PASSED YOU A MESSAGE", font, Brushes.White, new Point(vFReader.Width / 2, 170), format);

            graphics.Flush();

            vFWriter.WriteVideoFrame(image);
        }
        vFWriter.Flush();
    }
}

Это работает довольно медленно, так что я был интересно, если это неправильный подход взять?

Или, есть ли способ, чтобы ускорить выполнение моего текущего кода?



496
-1
задан 13 апреля 2018 в 10:04 Источник Поделиться
Комментарии
2 ответа

Значение по одному кадру с диска будет медленной. Не могли бы вы не читать N кадров, спрятать их в буфер и потом обрабатывать их и записывать их обратно.

Изображение, которое вы накладываете не меняется, поэтому можно не наносить изображения на прозрачном фоне, а затем его передача битового блока в каждом кадре.

Написание навалом (как и чтение) может быть быстрее.

0
ответ дан 13 апреля 2018 в 11:04 Источник Поделиться

это будет очень полезно знать, какие библиотеки вы используете, я нашел разные результаты для VideoFileReader ( AForge может быть ? )

Но в целом это будет очень полезно для использования асинхронного ввода-вывода ( если они доступны ), как функцию flushasync(), WriteAsync и так далее.

Другим вариантом может быть разделение чтения - необходимости модифицировать - писать процесс в потоке задач https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-write-messages-to-and-read-messages-from-a-dataflow-block

0
ответ дан 13 апреля 2018 в 02:04 Источник Поделиться