Kot_Matrosskin
@Kot_Matrosskin

В C#, в чем причина отсутствия данных от ffmpeg?

Доброго времени суток! Я новичок, поэтому можно пинать, но не сильно:).
Первые пробы пера. Пишу простенькую GUI для ffmpeg-комбайна. Есть метод, который при открытии файла получает инфо о файле путем запуска ffmpeg.exe с параметрами -i input_video.mp4. При запуске процесса перенаправляю поток методом RedirectStandardOutput и перехватываю асинхронным методом BeginOutputReadLine, записывая данные потока по событию OutputDataReceived в переменную string. При этом в переменную попадает null, синхронный метод StandardOutput.ReadLine() тоже дает null., исключений нет, программа не вылетает. В переменную попадает только последнее значение "чтение завершено".
При этом если перехватывать cmd с каким-нибудь параметром ipconfig, то все отрабатывает.
Что за особенность у вывода ffmpeg, может много строк, и переполнение?

public string Info()
        {
            Process process = Process.Start(new ProcessStartInfo
            {
                FileName = "ffmpeg",
                Arguments = $" -i {Input} -hide_banner",
                RedirectStandardOutput = true,
                RedirectStandardError=true,
                UseShellExecute = false,
                CreateNoWindow = true
            });

            //info = process.StandardOutput.ReadLine();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            process.OutputDataReceived += (s, a) => { info += a.Data; };
            process.WaitForExit();
            
            info += "чтение завершено";
            return info;
        }


Переменная Input объявлена выше в классе, в нее попадает полный путь файла при открытии, она не пустая. Если поток не перенаправлять то консоль нормально отрабатывает, т.е. ffmpeg.exe получает правильные параметры.
При этом метод по конвертации работает без проблем, код ниже

public void Processing()
        {
            Process process = Process.Start(new ProcessStartInfo
            {
                FileName = "ffmpeg",
                Arguments = $" -i {Input} {Bitrate}{Resolution}{Output}",
            });
        }
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
Kot_Matrosskin
@Kot_Matrosskin Автор вопроса
УРА! нашел причину. Перехват потока идет не из метода StandardOutput.ReadLine() и из StandardError.ReadLine()

public string Info()
        {
            Process process = Process.Start(new ProcessStartInfo
            {
                FileName = "ffmpeg",
                Arguments = $" -i {Input} -hide_banner",
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = true
            });

            while (!process.StandardError.EndOfStream)
            {
                info += process.StandardError.ReadLine()+ "\n";
            }
            info += "чтение завершено";
            return info;
        }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы