【发布时间】:2010-05-29 05:23:51
【问题描述】:
我最近一直在开发一个使用 flac.exe 和 lame.exe 在 C# 中将 flac 文件转换为 mp3 的程序,以下是完成这项工作的代码:
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是键入“string”,我必须将其转换为 byte[] 才能将其放入缓存,我认为这很难看,我尝试了这种方法,但结果不正确。
有什么方法可以绕过 OutputDataReceived 事件以同步或异步方式读取原始重定向的标准输出流?
PS:我之所以不使用lame直接写入磁盘是因为我在尝试并行转换多个文件,直接写入磁盘会造成严重的碎片。
非常感谢!
【问题讨论】: