Взаимодействовать с 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!");
}