Я написал функцию Azure в С#, которая сократит большие файлы mp4 за небольшую продолжительность. Я скопировал все, что требуется (ffmpeg выполнимый, видеофайл) в домашнем каталоге через консоль KUDU. Но когда я запускаю функцию, она работает более 5 минут, и она не дает никаких файлов в домашнем каталоге.
Функция:
using System;
using System.Diagnostics;
public static void Run(string input, TraceWriter log)
{
log.Info("Executing");
using (var process = new Process())
{
process.StartInfo.FileName = @"D:\home\ffmpeg.exe";
process.StartInfo.Arguments = @"-i D:\home\AmnestyInternational.mp4 -ss 00:00:03 -t 00:00:08 -async 1 D:\home\cut.mp4";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
log.Info(Directory.GetCurrentDirectory());
log.Info("Cutting starts:"+DateTime.Now.ToString("h:mm:ss tt"));
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
log.Info("Cutting ends :"+DateTime.Now.ToString("h:mm:ss tt"));
log.Info(output);
}
}
Результат, видимый на функции Azure Консоль:
2017-03-24T11:06:00.705 Function started (Id=df082f54-719a-415f-b7f1-b10548a213be)
2017-03-24T11:06:00.721 Executing
2017-03-24T11:06:00.721 D:\Windows\system32
2017-03-24T11:06:00.721 Cutting start :11:06:00 AM
2017-03-24T11:07:14 No new trace in the past 1 min(s).
2017-03-24T11:08:14 No new trace in the past 2 min(s).
2017-03-24T11:09:14 No new trace in the past 3 min(s).
2017-03-24T11:10:14 No new trace in the past 4 min(s).
2017-03-24T11:11:00.758 Microsoft.Azure.WebJobs.Host: Timeout value of 00:05:00 was exceeded by function: Functions.ManualTriggerCSharp1.
Когда я пытаюсь выполнить эту же команду на консоли KUDU или на моем собственном ПК, это займет всего 1,5 минуты, и я получаю файл с требуемой продолжительностью
Может ли кто-нибудь помочь мне в этом? Что мне может не хватать?
Одним из улучшений было бы получение инкрементных обновлений прогресса из stdout, предполагая, что ваш процесс имеет выход. Я считаю, что ReadToEnd()
будет блокироваться до тех пор, пока ваш процесс не выйдет (и здесь он появится в первый раз). См. Примеры sync & async: Process.start: как получить результат?
Максимальный тайм-аут для плана потребления составляет 5 минут, но если вы запустите свою функцию в специализированной службе приложения, вы можете установить тайм-аут на любое значение по вашему выбору.
Я не мог понять, почему FFMPEG не выполнялся, пока не понял, что мне нужно находиться в той же папке, что и EXE (в вашем случае, D:\home
). Это была строка кода, которую я пропустил:
Directory.SetCurrentDirectory(@"D:\home");
После этого:
process.StartInfo.WorkingDirectory = @"D:\home";
process.StartInfo.FileName = "ffmpeg.exe";
и т.п.