C # и FFmpeg желательно без команд оболочки? - PullRequest
18 голосов
/ 10 ноября 2009

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

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

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

Ответы [ 5 ]

35 голосов
/ 14 ноября 2009

Вы можете легко реализовать индикатор выполнения, если запустите 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 ();
        }
}
6 голосов
/ 10 ноября 2009

Есть библиотека оболочки поверх FFmpeg для .NET.

3 голосов
/ 14 августа 2018

Я нашел этот пост несколько недель назад, когда искал ответ на свою проблему. Я попытался запустить процесс ffmpeg и передать ему аргументы, но это заняло так много времени. На данный момент я использую Xabe.FFmpeg , поскольку он делает это «из коробки», и мне не нужно беспокоиться о исполняемых файлах ffmpeg, потому что есть возможность загрузить последнюю версию.

bool conversionResult = await new Conversion().SetInput(Resources.MkvWithAudio)
  .AddParameter(String.Format("-f image2pipe -i pipe:.bmp -maxrate {0}k -r {1} -an -y {2}",bitrate, fps, outputfilename))
  .Start();

Доступна документация здесь , показывающая, как получить текущий процент конверсии.

2 голосов
/ 17 ноября 2009

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

1 голос
/ 13 ноября 2009

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

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