Laravel中使用pbmedia/laravel-ffmpeg添加文字水印失败排查
问题描述
使用pbmedia/laravel-ffmpeg给视频添加文字水印时触发错误,核心报错信息:
[AVFilterGraph @ 0000020e99b5f0c0] No option name near '/Freelancer/version58trials/version58trials/public/webfonts/arial.TTF:text=Stack Overflow:fontcolor=white:fontsize=24'
相关代码如下:
$format = new X264(); $format->setAudioCodec('aac'); $format->setVideoCodec('libx264'); $format->setKiloBitrate(0); $localPath = '/' . $this->video->id . '.mp4'; $ffmpeg = FFMpeg::fromDisk("public") ->open($localPath) ->addFilter(function ($filters) { $filters->custom("drawtext=fontfile=S:/Freelancer/version58trials/version58trials/public/webfonts/arial.TTF:text='Stack Overflow':fontcolor=white:fontsize=24"); }) ->export() ->toDisk('public') ->inFormat($format) ->save("watermark_video_added.mp4");
已确认视频路径和字体路径均正确,问题出在FFmpeg添加水印的逻辑上。
问题原因
FFmpeg的drawtext滤镜使用冒号:作为参数分隔符,你使用的Windows字体路径里包含盘符后的冒号S:,FFmpeg会误把S:后面的内容当成新的参数键名,导致解析失败。
解决方法
将fontfile的路径用单引号或双引号包裹,让FFmpeg把整个路径识别为一个完整的参数值:
修正后的代码
$format = new X264(); $format->setAudioCodec('aac'); $format->setVideoCodec('libx264'); $format->setKiloBitrate(0); $localPath = '/' . $this->video->id . '.mp4'; $ffmpeg = FFMpeg::fromDisk("public") ->open($localPath) ->addFilter(function ($filters) { // 用单引号包裹字体路径,避免FFmpeg误解析冒号 $filters->custom("drawtext=fontfile='S:/Freelancer/version58trials/version58trials/public/webfonts/arial.TTF':text='Stack Overflow':fontcolor=white:fontsize=24"); }) ->export() ->toDisk('public') ->inFormat($format) ->save("watermark_video_added.mp4");
额外注意事项
- 如果路径中包含空格,同样需要用引号包裹,防止FFmpeg拆分参数
- 也可以尝试使用相对路径(相对于项目根目录),比如
public/webfonts/arial.TTF,减少特殊字符带来的解析问题
内容的提问来源于stack exchange,提问作者Kelash
相关产品推荐
相关产品推荐

