C# и FFmpeg предпочтительно без команд оболочки?

Это может также быть результатом использования отражения. Если у Вас есть код, который размышляет над классом и извлекает метод по имени (например: с Class.getDeclaredMethod("someMethodName", .....)) тогда любое время, когда имя метода изменяется, такой как во время осуществления рефакторинг, необходимо будет не забыть обновлять параметры к отражательному методу для соответствия новой сигнатуре метода, или эти getDeclaredMethod, вызов бросит NoSuchMethodException.

, Если это - причина, то отслеживание стека должно показать точку, что отражательный метод вызывается, и необходимо будет просто обновить параметры для соответствия фактической сигнатуре метода.

, По моему опыту, это иногда подходит когда поблочное тестирование частные методы/поля и использование TestUtilities класс для извлечения полей для тестовой проверки. (Обычно с унаследованным кодом, который не был разработан с поблочным тестированием в памяти.)

19
задан i_am_jorf 18 November 2009 в 20:54
поделиться

4 ответа

Вы можете легко реализовать индикатор выполнения, запустив ffmpeg. Вывод ffmpeg во время работы выглядит примерно так:

frame= 3366 fps=465 q=31.0 Lsize=    6474kB time=140.35 bitrate= 377.9kbits/s

И он обновляется ~ два раза в секунду. Вы можете проанализировать эту строку и получить данные, необходимые для отображения прогресса. Когда вы запускаете в командной строке, вы видите, что все время обновляется только одна строка, но что делает ffmpeg, так это записывает строку, за которой следует \ r . Вот почему вы не видите нескольких строк. Однако при использовании StreamReader.ReadLine () для вывода ошибок программы вы получаете одну строку для каждого обновления.

Ниже приводится пример кода для чтения вывода. Вам придется игнорировать любую строку, которая не начинается с 'frame', возможно, используйте BeginErrorReadLine () + ErrorDataReceived , если вы хотите, чтобы строки считывались асинхронно и т. Д., Но вы получаете идея (на самом деле я ее проверял):

using System;
using System.Diagnostics;
using System.IO;

class Test {
        static void Main (string [] args)
        {
                Process proc = new Process ();
                proc.StartInfo.FileName = "ffmpeg";
                proc.StartInfo.Arguments = "-i " + args [0] + " " + args [1];
                proc.StartInfo.RedirectStandardError = true;
                proc.StartInfo.UseShellExecute = false;
                if (!proc.Start ()) {
                        Console.WriteLine ("Error starting");
                        return;
                }
                StreamReader reader = proc.StandardError;
                string line;
                while ((line = reader.ReadLine ()) != null) {
                        Console.WriteLine (line);
                }
                proc.Close ();
        }
}
36
ответ дан 30 November 2019 в 02:45
поделиться

Существует библиотека-оболочка поверх FFmpeg для .NET.

6
ответ дан 30 November 2019 в 02:45
поделиться

Как насчет написания оболочки C ++ / CLI вокруг собственного интерфейса ffmpeg и последующего вызова интерфейса оболочки из вашего приложения?

1
ответ дан 30 November 2019 в 02:45
поделиться

Я только что нашел fflib на sourceforge. Выглядит многообещающе, правда, не использовал.

2
ответ дан 30 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

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