You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用FFmpeg添加anullsrc后进程无法关闭的原因咨询

问题原因分析

添加anullsrc虚拟音频后FFmpeg进程无法自动终止的核心原因是:

  • anullsrc是lavfi提供的无限音频流生成器,它不会主动停止,会一直输出静音音频。
  • 原来无音频时,OpenGL视频流停止推送后,FFmpeg检测到视频输入结束就会自动退出;但现在有了无限音频流,FFmpeg会一直等待音频输入,即使视频流停了,它也认为还有有效输入,所以不会主动终止。
  • 你原来的StopRecording方法里的关闭标准输入、释放进程操作,无法让FFmpeg感知到“要结束”的信号——因为音频流还在“无限输出”,FFmpeg没理由停。
可行解决方案

方案1:给FFmpeg发送优雅退出命令

FFmpeg支持通过标准输入接收q命令来触发优雅退出,这是最直接的方式。

代码修改(C#)

确保启动FFmpeg进程时开启标准输入重定向:

var processStartInfo = new ProcessStartInfo
{
    FileName = "ffmpeg.exe",
    Arguments = "你的FFmpeg命令参数",
    RedirectStandardInput = true, // 必须开启这个
    UseShellExecute = false,
    CreateNoWindow = true
};
ffmpegProcess = Process.Start(processStartInfo);

然后修改StopRecording方法:

public void StopRecording()
{
    if (ffmpegProcess == null || ffmpegProcess.HasExited) return;

    // 向FFmpeg发送退出命令
    try
    {
        ffmpegProcess.StandardInput.WriteLine("q");
        ffmpegProcess.StandardInput.Flush();
    }
    catch (IOException)
    {
        // 标准输入可能已经关闭,忽略
    }

    // 等待进程退出,设置超时防止卡死
    if (!ffmpegProcess.WaitForExit(5000))
    {
        // 超时后强制终止
        ffmpegProcess.Kill();
    }

    ffmpegProcess.Dispose();
    ffmpegProcess = null;
}

方案2:让音频流和视频流同步结束

在FFmpeg命令里添加-shortest参数,让FFmpeg在最短的输入流结束时自动停止——也就是视频流停止后,音频流也跟着终止,FFmpeg自动退出,不需要手动干预。

修改后的FFmpeg命令示例

ffmpeg -f opengl -i <你的OpenGL源路径> -f lavfi -i anullsrc=channel_layout=mono:sample_rate=8k -shortest -c:v h264 -c:a aac output.mp4

如果你的视频时长是固定的,也可以直接用-t <时长>参数指定总录制时间,比如-t 00:05:00表示录制5分钟,到点FFmpeg自动退出。

为什么你的临时方案不够好
  • 后处理添加音频:相当于重新编码一次,批量处理时耗时翻倍是必然的,完全没必要。
  • 发送Ctrl+C信号:需要调用kernel32的API,还要处理进程组的问题(FFmpeg可能启动子进程),实现复杂且容易因为权限、进程环境问题失败,属于舍近求远。

内容的提问来源于stack exchange,提问作者Rabbex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:31:17