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

标签 c# process ffmpeg

我在我的应用程序中使用 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/

相关文章:

c# - Serilog 处置/关闭日志文件流

C# 确定 SQLite 数据库文件是否经过密码加密

C# XmL 序列化 - 将项目设置为属性仅显示 XML 中的整数

c - 通过动态链接使用 FFmpeg (libavformat) RTP 数据结构

ffmpeg - 如何在我的 ffmpeg 命令中添加比例

javascript - 递归搜索父->子关系,将 bool 应用于分支

c - 为目标文件中的指令分配地址

linux - 如何为Vec <f64>使用共享内存?

c++ - 等待多个对象,仅给出已创建的进程 vector

audio - 如何使用 ffmpeg 将新音频(不混合)添加到视频中?