#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 )