Подтвердить что ты не робот

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

Я хотел бы иметь возможность использовать FFmpeg для преобразования видеофайла из моей программы на С#. Я знаю, что могу просто вызвать команду оболочки, но есть ли лучший способ?

Проблема с вызовом команды через оболочку, я не уверен, что вы могли бы делать такие вещи, как индикатор выполнения и т.д.... или вы могли?

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

4b9b3361

Ответ 1

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

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

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

Далее следует пример кода для чтения. Вам придется игнорировать любую строку, которая не начинается с "рамки", возможно, используйте 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 ();
        }
}

Ответ 2

Там есть обертка через FFmpeg для .NET.

Ответ 3

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

Ответ 4

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