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

如何限制FFmpeg进程并发数?SemaphoreSlim实现方案咨询

SemaphoreSlim完全适用于你的场景

SemaphoreSlim正是为控制异步/同步操作的并发数量设计的,完美解决你同时启动过多FFmpeg进程导致系统资源耗尽的问题。以下是具体实现步骤和代码修改方案:

1. 声明SemaphoreSlim实例

在你的类中添加一个类级别的SemaphoreSlim对象,指定允许同时运行的FFmpeg进程最大数量(建议根据你的CPU核心数和系统内存调整,比如4、8,可自行测试最优值):

// 类成员变量
private readonly SemaphoreSlim _ffmpegSemaphore = new SemaphoreSlim(4);

2. 包装FFmpeg调用逻辑

创建一个异步方法,用SemaphoreSlim控制ExtractFrames的并发执行:

private async Task RunExtractFramesWithSemaphore(VideoFileModel vid)
{
    // 等待获取信号量
    await _ffmpegSemaphore.WaitAsync();
    try
    {
        // 执行FFmpeg帧提取逻辑
        // 如果ExtractFrames是同步方法,直接调用:ExtractFrames(vid);
        await ExtractFrames(vid);
    }
    finally
    {
        // 无论执行成功还是失败,都释放信号量
        _ffmpegSemaphore.Release();
    }
}

3. 修改原代码中的任务添加逻辑

把你原来添加ExtractFrames任务的代码替换成调用上面的包装方法:

原代码:

extractFramesTask.Add(System.Threading.Tasks.Task.Run(() => ExtractFrames(vid)));

修改后:

extractFramesTask.Add(RunExtractFramesWithSemaphore(vid));

4. 可选:处理SemaphoreSlim的资源释放

如果你的类实现了IDisposable接口,记得在Dispose方法中释放SemaphoreSlim:

public void Dispose()
{
    _ffmpegSemaphore.Dispose();
    // 其他资源释放逻辑
}

原理说明

  • WaitAsync():当前任务会等待,直到有可用的信号量(即并发数未达上限),才会继续执行后续的FFmpeg调用。
  • Release():执行完FFmpeg任务后释放信号量,让等待中的任务可以开始执行。
  • 这种方式能严格限制同时运行的FFmpeg进程数量,避免系统内存和CPU被占满导致冻结。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:03:40