gpt4 book ai didi

c# - ffmpeg 的奇怪行为 - 当我关闭我的应用程序时开始转换

转载 作者:行者123 更新时间:2023-12-04 22:56:22 27 4
gpt4 key购买 nike

我在我的应用程序中使用 ffmpeg 来旋转视频,但问题是当我开始转换时,ffmpeg 只显示它的版本信息而不开始实际的转换,但是当我关闭我的应用程序时,ffmpeg 进程仍然在任务栏中的运行进程中并开始转换文件。

ffmpeg 输出
enter image description here

这是我的代码,请告诉我哪里做错了。

void ConvertVideo(object[] arr) {

string Argument = (string)arr[0];
string OutputFolder = (string)arr[1];
string ConvertedFile = (string)arr[2];


UpdateStatus("Converting! Please wait...");
ffmpeg = new Process();
ffmpeg.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
ffmpeg.StartInfo.FileName = "ffmpeg.exe";
ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.RedirectStandardError = true;
ffmpeg.StartInfo.RedirectStandardOutput = true;
ffmpeg.StartInfo.CreateNoWindow = true;
ffmpeg.StartInfo.Arguments = Argument;
ffmpeg.Start();
myStreamReader = ffmpeg.StandardError;
outputLine = myStreamReader.ReadLine();
UpdateRTB(outputLine);//Write line to ritchtextbox
do
{
if (outputLine.Contains("muxing overhead"))
{
UpdateStatus("Muxing video");
}

if (outputLine.StartsWith("frame"))
{
UpdateStatus("Converting video");
}
}
while (!(ffmpeg.HasExited & (string.Compare(outputLine, "") == 0 | outputLine == null)));
ffmpeg.Close();
myStreamReader.Close();
UpdateStatus("Convertion completed successfully");
}

最佳答案

看起来您没有初始化 stdout 的重定向,而您只是从 StandardError 中读取流一次。您很可能会因为 stdout 或 stderr 流充满未处理的数据而导致进程停滞。

如果将处理程序连接到 OutputDataReceivedErrorDataReceived ffmpeg 上的事件处理对象并调用 BeginOutputReadLineBeginErrorReadLine在它上面,你可以从进程中获取异步输出事件。使用这些来更新您的显示等。将处理程序连接到 Exited事件发出退出信号,您可以异步完成整个操作。

对于同步转换,试试这个:

void ConvertVideo(object[] arr) {

string Argument = (string)arr[0];
string OutputFolder = (string)arr[1];
string ConvertedFile = (string)arr[2];


UpdateStatus("Converting! Please wait...");
using (ffmpeg = new Process())
{
ffmpeg.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
ffmpeg.StartInfo.FileName = "ffmpeg.exe";
ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.RedirectStandardError = true;
ffmpeg.StartInfo.RedirectStandardOutput = true;
ffmpeg.StartInfo.CreateNoWindow = true;
ffmpeg.StartInfo.Arguments = Argument;

ffmpeg.OutputDataReceived += ffmpeg_OutputDataReceived;
ffmpeg.ErrorDataReceived += ffmpeg_ErrorDataReceived;

ffmpeg.Start();
ffmpeg.BeginErrorReadLine();
ffmpeg.BeginOutputReadLine();

ffmpeg.WaitForExit();
}

UpdateStatus("Convertion completed successfully");
}

public void ffmpeg_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
// ignore data from stdout?
}

public void ffmpeg_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
UpdateRTB(e.Data);

if (e.Data.Contains("muxing overhead"))
UpdateStatus("Muxing video");

if (e.Data.StartsWith("frame"))
UpdateStatus("Converting video");
}

关于c# - ffmpeg 的奇怪行为 - 当我关闭我的应用程序时开始转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20604808/

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