Nreco ConvertMedia работает очень медленно в функциях Azure

#c# #.net #.net-core #azure-functions #nreco

#c# #.net #.net-core #azure-функции #nreco

Вопрос:

У меня есть проект на бессерверной платформе azure function с .net core 3. В этом проекте у меня есть функция, которая преобразует видеофайлы из разных форматов в формат mp4 с помощью Nreco.VideoConverter.

Когда я запускаю его локально, он работает отлично. Но когда я развертываю, это работает, но для этого требуется гораздо больше времени (например: для файла размером 1,3 Мб локальное преобразование занимает 10 секунд, а для развернутой версии — около 100 секунд)

это мой код:

 public static Stream ConvertVideoToMp4(Stream fileStream, string fileName)
{
    MemoryStream outputStream = new MemoryStream();
    try
    {
        string inputFormat = GetVideoFormat(fileName);
        FFMpegConverter ffMpeg = initFfmpeg();

        if (ffMpeg == null)
        {
            throw new Exception("ffMpeg was not initilaized correctly");
        }

        string tempOriginalFilePath = Path.Combine(Path.GetTempPath(), fileName);

        if (File.Exists(tempOriginalFilePath))
        {
            File.Delete(tempOriginalFilePath);
        }

        using (var fs = new FileStream(tempOriginalFilePath, FileMode.Create, FileAccess.ReadWrite))
        {
            fileStream.CopyTo(fs);
            ffMpeg.ConvertMedia(tempOriginalFilePath, outputStream, Format.mp4);
        }

        File.Delete(tempOriginalFilePath);
    }
    catch (Exception ex)
    {
        Logger.Error(ex);
    }
    return outputStream;
}

private static FFMpegConverter initFfmpeg()
{
    //License setup
    //https://www.nuget.org/packages/NReco.VideoConverter.LT/
    FFMpegConverter ffMpeg = null;

    try
    {
        ffMpeg = new FFMpegConverter();

        NReco.VideoConverter.License.SetLicenseKey("secretKey");

        ffMpeg.FFMpegExeName = "ffmpeg.exe";

        DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory());
        dir = new DirectoryInfo(dir.Parent.Parent.Parent.FullName);
        ffMpeg.FFMpegToolPath = dir.FullName   @"ffmpeg";

        //then we are on the serveless enviroment 
        if (!File.Exists(dir.FullName   @"ffmpegffmpeg.exe"))
        {
            ffMpeg.FFMpegToolPath = @"D:homesitewwwrootffmpeg";
        }
    } 
    catch (Exception ex)
    {
       Logger.Error(ex);
    }

    return ffMpeg;
}
  

Кто-нибудь знает, как это решить?

Комментарии:

1. по умолчанию ffmpeg использует все доступные ядра процессора, поэтому, скорее всего, у вас больше ядер локально, чем в вашей функциональной среде Azure. Здесь нет волшебства: кодирование видео — очень трудоемкая задача.

2. Итак, вы говорите, что нет способа увеличить скорость этого процесса?

3. Вам нужно больше ядер процессора или виртуальной машины, подходящей для аппаратного ускорения кодирования (см. trac.ffmpeg.org/wiki/HWAccelIntro )