C # / ASP.Net работает в фоновом режиме в приложении в среде Apache2 / Mod_Mono - PullRequest
0 голосов
/ 15 января 2019

Я создаю веб-приложение, которое позволяет пользователям загружать видео. когда пользователь отправляет форму, страница сохраняет загруженный файл в папку, а затем вызывает ffmpeg в фоновом режиме, чтобы преобразовать загруженный файл .mp4 в .webm. Проблема в том, что ffmpeg не запускается. Я должен отметить, что это тестируется на сервере Ubuntu 18.10 с использованием Apache2 и Mod_Mono для запуска кода ASP.Net/C#.

Я попытался найти решение этой проблемы и обнаружил, что использование BackgroundWorkers могло бы позволить мне делать то, что я хотел.

Однако, когда я попытался использовать BackgroundWorkers, как описано в этой статье, он, кажется, запускает процесс ffmpeg только в течение доли секунды для преобразования видеофайла. файл .webm создается с размером файла 0 кб.

protected void btnModalEditor_Click(object sender, EventArgs e)
{
    string baseDir = "/var/webfolder/"; //This line is actually obtained through an ini file on the site.
    string filePath = "/var/webfolder/savedvideos/"; //Folder the video is saved to.
    fileName = Path.GetFileNameWithoutExtension(editVideoUp.FileName);
    fileExt = Path.GetExtension(editVideoUp.FileName);
    editVideoUp.SaveAs(filePath + fileName + fileExt);
    dbAccess.CreateDBEntry(fileName); //Creates an entry in my database for the video.
    string vidID = dbAccess.LastInsertID().ToString(); //gets the id of the entry created in the mySql database.
    //Create the BackgroundWorker to call the process.
    BackgroundWorker vidConvProcess = new BackgroundWorker();
    vidConvProcess.DoWork += new DoWorkEventHandler(ConvertVideo);
    vidConvProcess.WorkerReportsProgress = false;
    vidConvProcess.WorkerSupportsCancellation = false;
    vidConvProcess.RunWorkerAsync(argument: filePath + "," + fileName + "," + fileExt + "," + baseDir + "," + vidID);
}

private static void ConvertVideo(object sender, DoWorkEventArgs e)
{
    string vidFile = e.Argument.ToString();
    string[] fPart = vidFile.Split(',');
    string convID = fPart[4];
    string convLogName = fPart[3] + "ConversionLogs/convers-" + convID + ".txt";
    // Long running background operation. should be able to run and forget about.
    Process process = new Process();
    process.StartInfo.FileName = "ffmpeg";
    process.StartInfo.Arguments = "-y -i \"" + fPart[0] + fPart[1] + fPart[2] + "\" -r 29.97 -vf scale=-1:720 -crf 17 -preset medium -max_muxing_queue_size 2000 \"" + fPart[0] + fPart[1] + ".webm\" -async 1 -vsync passthrough -frame_drop_threshold 20 2> \"" + convLogName + "\" &";
    process.StartInfo.UseShellExecute = true;
    process.StartInfo.CreateNoWindow = true;
    process.Start();
    process.WaitForExit();
}

По сути, я бы хотел, чтобы пользователь отправлял форму и загружал видео, сохранял ее в "/ var / webfolder / savevideos /", а затем запускал фоновый процесс для ffmpeg, который преобразует пользователь загрузил .mp4 в файл .webm. Мне не нужно ничего настраивать, чтобы остановить процесс или проверить его ход, просто запустите его в фоновом режиме и забудьте об этом, позволяя пользователю делать другие действия на сайте.

ОБНОВЛЕНИЕ (Мои извинения, если это должно быть сделано как отдельный ответ / вопрос, я не был уверен)

Я действительно выяснил, что причина, по которой он не работал, была связана с тем, что я в основном пытался указать StandardOutput в аргументах, что явно не нравится C # / ASP.NET. Поэтому, удалив '2> \ "" + convLogName + "\" & "' из process.StartInfo.Arguments, теперь процесс запускается, пока UseShellExecute = true.

Чтобы обойти отсутствие выходных журналов, чтобы определить, завершился ли запуск ffmpeg, я добавил process.WaitForExit(). Однако, если я сделаю это, то BackgroundWorker заставит страницу зависнуть, пока она ждет завершения ffmpeg, чего я не хочу. Есть ли способ хорошо и по-настоящему позволить этому процессу работать в фоновом режиме, не останавливая графический интерфейс, пока он это делает?

...