Laravel队列任务中Protonemedia/FFMpeg包类型错误求助
解决Laravel-FFMpeg拼接视频时的TypeError错误
这个错误的根源很明确:你在处理多视频拼接的场景时,错误地使用了单个视频的过滤器类型提示。
问题分析
当你调用 FFMpeg::open() 传入一个数组(多个视频文件)时,Laravel-FFMpeg会启用复杂媒体操作模式,此时addFilter()方法传入的闭包参数是ComplexFilters实例,而不是单个视频对应的VideoFilters。你的代码里把闭包参数类型声明为VideoFilters,类型不匹配就抛出了这个TypeError。
修复步骤
替换过滤器类型引入与声明
首先引入正确的过滤器类:use FFMpeg\Filters\AdvancedMedia\ComplexFilters;然后把
addFilter闭包的参数类型从VideoFilters改为ComplexFilters。调整Resize逻辑
ComplexFilters的resize方法可以直接作用于所有输入流,确保拼接的视频尺寸统一:
修正后的完整handle()方法
public function handle() { $filename = Str::uuid().'.mp4'; FFMpeg::fromDisk('public') ->open(['intro.mp4', $this->video->path]) ->addFilter(function (ComplexFilters $filters) { $filters->resize(new \FFMpeg\Coordinate\Dimension(640, 480)); }) ->export() ->toDisk('public') ->inFormat(new \FFMpeg\Format\Video\X264) ->concatWithTranscoding($hasVideo = true, $hasAudio = true) ->save($filename); }
额外注意事项
- 如果你需要对单个视频文件进行滤镜操作(比如先处理用户上传的视频,再和片头拼接),可以先分别处理单个视频,这种场景下才会用到
VideoFilters。 - 别忘了在你的Job类顶部引入
Throwable类,否则failed()方法会报错:use Throwable;
内容的提问来源于stack exchange,提问作者Simpledev
相关产品推荐
相关产品推荐

