Взаимодействовать с ffmpeg из программы .NET? - PullRequest
6 голосов
/ 04 сентября 2011

Я пытаюсь создать оболочку .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 ]

6 голосов
/ 08 сентября 2011

Вот ответ:

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!");
}
0 голосов
/ 04 сентября 2011

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

...