Я недавно работал над программой, которая конвертировать FLAC файлы mp3 в C# с помощью flac.exe и lame.exe, вот код, который делает работу:О перенаправлены стандартном выводе в System.Diagnostics.Process
ProcessStartInfo piFlac = new ProcessStartInfo("flac.exe");
piFlac.CreateNoWindow = true;
piFlac.UseShellExecute = false;
piFlac.RedirectStandardOutput = true;
piFlac.Arguments = string.Format(flacParam, SourceFile);
ProcessStartInfo piLame = new ProcessStartInfo("lame.exe");
piLame.CreateNoWindow = true;
piLame.UseShellExecute = false;
piLame.RedirectStandardInput = true;
piLame.RedirectStandardOutput = true;
piLame.Arguments = string.Format(lameParam, QualitySetting, ExtractTag(SourceFile));
Process flacp = null, lamep = null;
byte[] buffer = BufferPool.RequestBuffer();
flacp = Process.Start(piFlac);
lamep = new Process();
lamep.StartInfo = piLame;
lamep.OutputDataReceived += new DataReceivedEventHandler(this.ReadStdout);
lamep.Start();
lamep.BeginOutputReadLine();
int count = flacp.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);
while (count != 0)
{
lamep.StandardInput.BaseStream.Write(buffer, 0, count);
count = flacp.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);
}
Здесь я устанавливаю параметры командной строки, чтобы сообщить lame.exe, чтобы записать свой вывод в stdout, и использовать событие Process.OutPutDataRecerved для сбора выходных данных, которые в основном являются двоичными данными, но DataReceivedEventArgs.Data типа «строка», и я должен преобразовать его в байт [], прежде чем положить его в кеш, я думаю, что это уродливо, и я пробовал этот подход, но результат неверен.
Есть ли способ, которым я могу читать поток перенаправленного исходного потока, либо синхронно, либо асинхронно, минуя событие OutputDataReceived?
PS: причина, по которой я не использую хромой для записи на диск, заключается в том, что я пытаюсь преобразовать несколько файлов параллельно, и прямая запись на диск вызовет сильную фрагментацию.
Большое спасибо!
есть переключатель командной строки, чтобы указать flac для записи в stdout, а также для хромого. Я попытался сделать хромой, чтобы написать stdout и перенаправить файл в командной строке, и он работает. – sforester
OK. Но поскольку .Net ожидает, что stdout будет строкой, возможно, интерпретирует нули в выходных данных как «конец строки». Это может быть вашей проблемой. – logicnp