Не удается сохранить поток вывода процесса в файл - PullRequest
0 голосов
/ 10 октября 2018

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

var ffmpeg = HttpContext.Current.Server.MapPath("~/FFMpeg/ffmpeg.exe");
var outputDir = HttpContext.Current.Server.MapPath("~/Uploads/converted.mp4");
var inputDir = "https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_10mb.mp4";
var args = "-i " + inputDir + " -c:v libx264 -preset veryslow -crf 26 " +
            "-ar 44100 -ac 2 -c:a aac -strict -2 -b:a 128k -";

var process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = ffmpeg;
process.StartInfo.WorkingDirectory = ffmpeg.Replace("\\ffmpeg.exe", "");
process.StartInfo.Arguments = args;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.EnableRaisingEvents = true;
//process.WaitForExit();
Stream output = process.StandardOutput.BaseStream;
process.Exited += (sender, e) =>
{
    using (var fileStream = File.Create(outputDir))
    {
        output.Seek(0, SeekOrigin.Begin);
        output.CopyTo(fileStream);
    }
};  

Выходной файл converted.mp4 создан, но его 0 КБ.

1 Ответ

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

Насколько я понимаю, из-за продолжительности процесса IIS завершает работу приложения, прежде чем оно сможет сделать что-нибудь стоящее.Это не означает, что IIS не может запустить внешнюю программу, которая заменит вас, поэтому в основном вы перемещаете процесс (.exe) из пространства пользователей IIS в более подходящее и многопоточное пространство пользователей.Вы можете свернуть свою собственную систему управления очередью, но в прошлом я использовал HangFire, так как он лучше подходит для этой задачи.Используя hangfire, вы можете отправить задание на преобразование файла и позволить ему обработать запрос пользователя, и вы просто поместите запись в базу данных, которая показывает состояние данных, которые преобразовывает FFMPEG.Поэтому, когда пользователь обновляет страницу, он будет запрашивать информацию в БД, а не в консольном выводе самого EXE-файла (который был бы удален из обновления.)

https://www.hangfire.io/

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