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

如何在Obj-C中彻底终止FFmpeg/MobileFFmpeg运行进程?

解决MobileFFmpeg进程无法取消的问题

你当前的代码存在两个关键问题:一是在取消方法里才设置代理,这对取消操作没有帮助;二是仅调用全局cancel方法可能无法精准终止当前正在运行的会话。以下是正确的实现步骤:

1. 保存FFmpeg会话ID

启动视频处理时,必须保存执行FFmpeg命令返回的会话ID,后续取消操作要针对这个特定会话:

// 成员变量声明:@property (nonatomic, assign) long ffmpegSessionId;
// 启动处理时
self.ffmpegSessionId = [MobileFFmpeg execute:@"你的视频处理命令"];

2. 实现精准取消逻辑

取消时优先针对保存的会话ID执行终止操作,再清理代理和全局兜底:

-(void) cancelFFmpegProcessing {
    // 终止当前会话
    if (self.ffmpegSessionId != 0) {
        [MobileFFmpeg cancelSession:self.ffmpegSessionId];
        self.ffmpegSessionId = 0;
    }
    
    // 移除代理,避免无效回调
    [MobileFFmpegConfig setStatisticsDelegate:nil];
    [MobileFFmpegConfig setLogDelegate:nil];
    
    // 兜底:终止所有FFmpeg进程(如果会话取消未生效时使用)
    [MobileFFmpeg cancel];
}

3. 验证取消状态(可选)

取消后可以检查会话状态,确认是否成功终止:

int sessionState = [MobileFFmpeg getSessionState:self.ffmpegSessionId];
if (sessionState == SESSION_STATE_CANCELED) {
    // 取消成功,可执行后续资源清理
}

额外注意点

  • 避免在FFmpeg命令中使用强制不可中断的参数,部分编码逻辑会完成当前帧处理后才响应终止信号,这是正常现象
  • 确保启动处理的线程没有被标记为不可终止的后台任务,否则系统会阻止进程终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:52:14