gpt4 book ai didi

c# - 在 stdin 首先关闭的地方重定向 stdin 和 stdout

转载 作者:行者123 更新时间:2023-11-30 12:53:51 26 4
gpt4 key购买 nike

这实际上与我已经回答的另一个问题有关。这个问题在这里:Redirecting stdout of one process object to stdin of another

我的问题是(我认为)获取输入的程序应该在程序输出之前退出。这是我正在做的 bash 等价物: tccat -i/dev/sr0 -T 1 | ffmpeg -i - -r 1 -t 1 -s 96x72 -ss 5/tmp/wsmanage/preview_tmp/test\%03d.jpg

这只是使用一个名为 tccat 的程序来读取 DVD 的第一个标题。这将输出到 ffmpeg,它将以每秒 1 帧的速度创建一个 .jpg 格式的 1 秒长的输出文件。一旦它输出它的帧(或两个)它就存在。这很好用。

然而,下面的代码没有。我收到大量“Printing line to ffmpeg”,而命令行版本仅在一秒钟内退出。然后,它会在 30 或 40 秒左右后停止打印。 FFmpeg 永远不会退出,我的程序也永远不会继续。

我这样做对吗?

Process tccatProcess = new Process();           
tccatProcess.StartInfo.FileName = "tccat";
tccatProcess.StartInfo.Arguments = String.Format("-i {0} -T {1}", devNode, title);
tccatProcess.StartInfo.UseShellExecute = false;
tccatProcess.StartInfo.RedirectStandardOutput = true;

Process ffmpegProcess = new Process();
string bashSafePreviewTemplate = slasher.bashSlash(previewTempDir + "/test%03d.jpg");
ffmpegProcess.StartInfo.FileName = "ffmpeg";
ffmpegProcess.StartInfo.Arguments = String.Format("-i - -r 1 -t 1 -s {1}x{2} -ss {3} {0}",
bashSafePreviewTemplate, width, height, timePosition);
ffmpegProcess.StartInfo.UseShellExecute = false;
ffmpegProcess.StartInfo.RedirectStandardInput = true;


try{
tccatProcess.Start();
ffmpegProcess.Start();

StreamReader tccatOutput = tccatProcess.StandardOutput;
StreamWriter ffmpegInput = ffmpegProcess.StandardInput;

string line;
while(!ffmpegProcess.HasExited)
{
ffmpegProcess.Refresh();
if((line = tccatOutput.ReadLine()) != null)
{
Console.WriteLine("Printing line to ffmpeg");
Console.Out.Flush();
ffmpegInput.WriteLine(line);
ffmpegInput.Flush();
}
}

Console.WriteLine("Closing tccat");
Console.Out.Flush();
tccatProcess.Close();
Console.WriteLine("Tccat closed");
Console.Out.Flush();


}catch(Exception e){
//uninteresting log code
return false;
}

最佳答案

对于任何想做类似事情的人,这里是应用了 KeeperOfTheSoul 的建议的新版本:

        Process tccatProcess = new Process();           
tccatProcess.StartInfo.FileName = "tccat";
tccatProcess.StartInfo.Arguments = String.Format("-i {0} -T {1}", devNode, title);
tccatProcess.StartInfo.UseShellExecute = false;
tccatProcess.StartInfo.RedirectStandardOutput = true;

Process ffmpegProcess = new Process();
string bashSafePreviewTemplate = slasher.bashSlash(previewTempDir + "/test%03d.jpg");
ffmpegProcess.StartInfo.FileName = "ffmpeg";
ffmpegProcess.StartInfo.Arguments = String.Format("-i - -r 1 -t 1 -s {1}x{2} -ss {3} {0}",
bashSafePreviewTemplate, width, height, timePosition);
ffmpegProcess.StartInfo.UseShellExecute = false;
ffmpegProcess.StartInfo.RedirectStandardInput = true;

Console.WriteLine("tccat command: {0} {1}", tccatProcess.StartInfo.FileName, tccatProcess.StartInfo.Arguments);
Console.WriteLine("ffmpeg command: {0} {1}", ffmpegProcess.StartInfo.FileName, ffmpegProcess.StartInfo.Arguments);

//return true;

try{
tccatProcess.Start();
ffmpegProcess.Start();

BinaryReader tccatOutput = new BinaryReader(tccatProcess.StandardOutput.BaseStream);
BinaryWriter ffmpegInput = new BinaryWriter(ffmpegProcess.StandardInput.BaseStream);
int buffSize = 4096;
byte[] buff = new byte[buffSize];


while(!ffmpegProcess.HasExited)
{
ffmpegProcess.Refresh();
buff = tccatOutput.ReadBytes(buffSize);
ffmpegInput.Write(buff);
ffmpegInput.Flush();
}


tccatProcess.Kill();
tccatProcess.Close();
ffmpegProcess.Close();


}catch(Exception e){
//uninteresting log code
return false;

}

关于c# - 在 stdin 首先关闭的地方重定向 stdin 和 stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1373387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com