Flutter集成ffmpeg_kit_flutter报ResultHandler无法向空event sink发事件错误
错误原因
你遇到的ResultHandler can not send event ... on a null event sink错误核心是FFmpegKit原生层执行完命令要给Flutter层发送回调事件时,对应的事件接收通道(EventSink)已经被销毁,无法完成事件投递,具体触发原因通常有三类:
- 执行FFmpeg命令的过程中,承载对应逻辑的Flutter页面/State已经被销毁(比如触发命令后立刻退出页面),EventSink跟随组件生命周期被释放,原生层回调时找不到接收端。
- 你当前使用的4.5.0 LTS版本的ffmpeg_kit_flutter存在已知的EventSink生命周期管理缺陷,快速重复创建销毁FFmpeg相关组件、或者并发执行多个FFmpeg任务时,很容易触发空事件 sink 问题。
- 你的输出文件名包含Android文件系统不允许的特殊字符
:,路径/data/user/0/com.sm.smofficial/app_flutter/Trimmer/VID_20211102_030320_trimmed:Dec5,2021-13:52:55.mp4中的冒号会导致FFmpeg写文件失败,任务提前异常结束的时间点刚好碰上EventSink被释放,也会抛出该错误。
解决方案
按照优先级依次排查修复即可:
- 先处理非法文件名:把输出文件名中所有的
:替换为下划线_等合法字符,比如修改为trimmed_Dec5_2021-13_52_55.mp4,先保证FFmpeg命令本身可以正常执行完成。 - 绑定任务和组件生命周期:在用到FFmpegKit的State的
dispose回调中,主动调用FFmpegKit.cancel(sessionId)终止还在运行的FFmpeg任务,避免任务结束后回调已经被销毁的EventSink。如果不需要监听执行进度,也可以直接使用无回调的FFmpegKit.execute同步执行接口,从根源上规避事件通道问题。 - 升级依赖版本:如果上述操作后问题仍然存在,将ffmpeg_kit_flutter升级到更高的稳定LTS版本即可修复版本自带的EventSink管理缺陷,你已经添加的
uses-sdk overrideLibrary配置可以保留,无需额外修改Android端配置。 - 混淆排查:如果仅在Release包出现该错误,检查混淆配置,添加ffmpeg_kit相关的保活规则,避免回调相关类被混淆删除导致EventSink初始化失败。
内容的提问来源于stack exchange,提问作者saeid teroda
相关产品推荐
相关产品推荐

