Как сделать загрузочный экран для ffmpeg, используя c # asp.net - PullRequest
0 голосов
/ 01 сентября 2011

У меня есть эта функция, и где команды Debug.WriteLine находятся, где я вывести значения.Как получить эти данные для печати на веб-странице, чтобы я мог имитировать загрузочный экран?Я вызываю эту функцию извне через файл веб-службы * .ashx.

private string ConvertToFLV(string phyicalFilePath)
        {
            if (Path.GetExtension(phyicalFilePath).Equals(".flv")) return phyicalFilePath;

            var argument = string.Format(@"-i ""{0}"" -vcodec flv -f flv -r 29.97 -s 320x240 -aspect 4:3 -b 300k -g 160 -cmp dct  -subcmp dct  -mbd 2 -flags +aic+cbp+mv0+mv4 -trellis 1 -ac 1 -ar 22050 -ab 56k ""{1}""", phyicalFilePath, Path.ChangeExtension(phyicalFilePath, "flv"));
            libfaac -ar 48000 -ab 128k -coder 1 -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -me_method hex -subq 6 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 1 -threads 0 {1}", phyicalFilePath, Path.ChangeExtension(phyicalFilePath, "mp4"));
            File.Delete(Path.ChangeExtension(phyicalFilePath, "flv"));

            ProcessStartInfo process = new ProcessStartInfo(ffmpegPhysicalPath, argument);
            Process proc = new Process();
            float duration = 0.00F, current = 0.00F;
            proc.StartInfo = process;
            proc.EnableRaisingEvents = false;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.RedirectStandardError = true;

            proc.Start();

            StreamReader d = proc.StandardError;

            do
            {
                string s = d.ReadLine();
                if (s.Contains("Duration: "))
                {
                    Debug.WriteLine("DURATION: " + s);

                }
                else
                {
                    if (s.Contains("frame="))
                    {
                        Debug.WriteLine("FRAME: " + s);

                    }
                }
            } while (!d.EndOfStream);


            proc.WaitForExit();

            return Path.ChangeExtension(phyicalFilePath, "flv");

1 Ответ

2 голосов
/ 01 сентября 2011

Вам нужно записать свой поток в какое-то хранилище данных, которое можно прочитать по веб-запросу.Вы не сможете обработать этот поток, как я думаю, вы хотите.Например, запишите эти данные в кеш / дб и постоянно читайте их клиенту.Вы можете попробовать некоторые из более «новых» вещей, таких как SignalR, и попытаться передать их клиенту, хотя для этого все равно потребуется чтение из общего хранилища.Таким образом, ваш Debug.WriteLines вместо этого будет методом, который будет записывать в очередь.Ваш клиент прочитал бы и удалил эти сообщения из очереди.

Если вас интересуют постоянные соединения в реальном времени, проверьте сообщение Скотта Хансельмана:

AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR

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