asp.net зависает кодировка видео ffmpeg - PullRequest
1 голос
/ 07 октября 2010

Ниже приведены методы кодирования видео, загруженных на веб-сайт с помощью ffmpeg. Он отлично работает для видео размером до 8-9 МБ, но если размер видео превышает 8-9 МБ, он зависает на веб-сайте. Единственный способ восстановить это перезапуск iis.

Когда я смотрю процесс, я вижу, что ffmpeg кодирует видео и выходит. Приведенное видео просто отлично. Проблема начинается, как только ffmpeg существует.

Приложение работает на веб-сервере win2003 x86 iis6

Кто-нибудь имел опыт кодирования больших файлов из веб-приложения asp.net с использованием ffmpeg?

public EncodedVideo EncodeVideo(VideoFile input, string encodingCommand, string outputFile)
    {
        EncodedVideo encoded = new EncodedVideo();
        Params = string.Format("-i \"{0}\" {1} \"{2}\"", input.Path, encodingCommand, outputFile);
        //string output = RunProcess(Params);
        string output = RunProcessLargeFile(Params);
        encoded.EncodingLog = output;
        encoded.EncodedVideoPath = outputFile;

        if (File.Exists(outputFile))
        {
            encoded.Success = true;
        }
        else
        {
            encoded.Success = false;
        }
        //System.Web.HttpContext.Current.Response.Write(Params);
        return encoded;

    }

private string RunProcessLargeFile(string Parameters)
    {
        /* The below will be the right solution ....
         * The while loop which reads the stream is very improtant 
         * for FFMPEG as .NET does not provide more memory to FFMPEG. 
         * When converting large files, FFMPEG's out put stream gets filled...
         * And waits for .NET to allocate memory resources but is never done. 
         * In order to utilize less memory, we are clearing the buffer periodically.
         **/

        ProcessStartInfo oInfo = new ProcessStartInfo(this.FFmpegPath, Parameters);
        oInfo.WorkingDirectory = Path.GetDirectoryName(this.FFmpegPath);
        oInfo.UseShellExecute = false;
        oInfo.CreateNoWindow = true;
        oInfo.RedirectStandardOutput = true;
        oInfo.RedirectStandardError = true; 
        Process proc = System.Diagnostics.Process.Start(oInfo);
        StreamReader srOutput = proc.StandardError;
        System.Text.StringBuilder output = new System.Text.StringBuilder();

        StreamReader objStreamReader = proc.StandardError;
        System.Text.StringBuilder sbOutPut = new StringBuilder();

        while (!proc.WaitForExit(1000))
        {
            sbOutPut.Append(objStreamReader.ReadToEnd().ToString());
        }

        if (proc.ExitCode == 0)
        {
            proc.Close();
            if (objStreamReader != null)
            {
                objStreamReader.Close();
            }
        }
        else
        {
            proc.Close();
            if (objStreamReader != null) objStreamReader.Close();
        }

        return sbOutPut.ToString();
    }

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Пахнет как типичный тупик.

Вы вызываете proc.WaitForExit до proc.StandardError.ReadToEnd метода, и кажется, что это вызывает тупик.

Ссылка от MSDN :

Условие тупика может возникнуть, если родительский процесс вызывает WaitForExit перед StandardOutput.ReadToEnd и дочерний процесс пишет достаточно текста заполнить перенаправленный поток. родительский процесс будет ждать бесконечно для дочернего процесса, чтобы выйти. дочерний процесс будет ждать бесконечно для родителей, чтобы прочитать из полного Стандартный поток вывода.

Итак, заменив цикл while на:

string output = objStreamReader.ReadToEnd();
proc.WaitForExit();

должен решить вашу проблему.

0 голосов
/ 11 октября 2010

Я не asp.net, я работаю с php и в php.ini, который является файлом конфигурации, я могу установить максимальное количество мегабайт, которое я могу загрузить.возможно, если вы проверите файл конфигурации, чтобы увидеть что-либо о загрузке, и установите его на максимум.

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