Взаимодействовать с ffmpeg из программы.NET?

Я пытаюсь создать оболочку.NET для преобразования медиа-файлов с помощью ffmepg, вот что я пробовал:

static void Main(string[] args)
{
  if (File.Exists("sample.mp3")) File.Delete("sample.mp3");

  string result;

  using (Process p = new Process())
  {
    p.StartInfo.FileName = "ffmpeg";
    p.StartInfo.Arguments = "-i sample.wma sample.mp3";

    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;

    p.Start();

    //result is assigned with an empty string!
    result = p.StandardOutput.ReadToEnd();

    p.WaitForExit();
  }
}

Что на самом деле происходит, так это то, что содержимое программы ffmpeg распечатывается в консольном приложении, но result Переменная является пустой строкой. Я хочу контролировать ход конвертации в интерактивном режиме, чтобы пользователю даже не нужно было знать, что я использую ffmpeg, но он все еще знает подробности прохождения конверсии, а также какой процент и т. Д. Приложение.

По сути, я также был бы доволен оберткой.NET для ТОЛЬКО функции преобразования P/Invoke в (мне не интересна вся внешняя библиотека, если я не могу извлечь из нее функцию PI).

Кто-нибудь с опытом работы в ffmpeg & .NET?

Обновление Пожалуйста, просмотрите мой следующий вопрос, как записать ввод в работающий процесс ffmpeg.

2 ответа

Решение

Вот ответ:

static void Main()
{
  ExecuteAsync();
  Console.WriteLine("Executing Async");
  Console.Read();
}

static Process process = null;
static void ExecuteAsync()
{
  if (File.Exists("sample.mp3"))
    try
    {
      File.Delete("sample.mp3");
    }
    catch
    {
      return;
    }

  try
  {
    process = new Process();
    ProcessStartInfo info = new ProcessStartInfo("ffmpeg.exe",
        "-i sample.wma sample.mp3");

    info.CreateNoWindow = false;
    info.UseShellExecute = false;
    info.RedirectStandardError = true;
    info.RedirectStandardOutput = true;

    process.StartInfo = info;

    process.EnableRaisingEvents = true;
    process.ErrorDataReceived +=
        new DataReceivedEventHandler(process_ErrorDataReceived);
    process.OutputDataReceived +=
        new DataReceivedEventHandler(process_OutputDataReceived);
    process.Exited += new EventHandler(process_Exited);

    process.Start();

    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
  }
  catch
  {
    if (process != null) process.Dispose();
  }
}

static int lineCount = 0;
static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
  Console.WriteLine("Input line: {0} ({1:m:s:fff})", lineCount++,
      DateTime.Now);
  Console.WriteLine(e.Data);
  Console.WriteLine();
}

static void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
  Console.WriteLine("Output Data Received.");
}

static void process_Exited(object sender, EventArgs e)
{
  process.Dispose();
  Console.WriteLine("Bye bye!");
}

Попробуйте использовать ffmpeg-sharp.

Другие вопросы по тегам