Laravel 9中exec执行FFmpeg drawtext命令失败问题求助
Laravel 9 中 FFmpeg drawtext 命令执行失败排查(终端正常)
问题描述
在Laravel 9后端通过exec调用FFmpeg处理视频时,其他FFmpeg命令均可正常运行,但drawtext滤镜命令执行失败。直接在终端执行完全相同的命令却能正常完成处理。执行后FFmpeg日志卡在音频流Stream #0:1[0x2]处,无后续处理进度或完成信息输出。
执行的命令
C:\ffmpeg\ffmpeg -i C:\xampp\htdocs\360_backend\storage\app\public\videos\sample.mp4 -filter_complex drawtext=\"x=640:y=360:fontsize=24:fontcolor=white:fontfile=georgia.ttf:text=test.txt\" -c:a copy C:\xampp\htdocs\360_backend\storage\app\public\videos\testtt3.mp4 2> C:\xampp\htdocs\360_backend\storage\app\public\videos\out.txt
日志输出
ffmpeg version 6.0-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12.2.0 (Rev10, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint libavutil 58. 2.100 / 58. 2.100 libavcodec 60. 3.100 / 60. 3.100 libavformat 60. 3.100 / 60. 3.100 libavdevice 60. 1.100 / 60. 1.100 libavfilter 9. 3.100 / 9. 3.100 libswscale 7. 1.100 / 7. 1.100 libswresample 4. 10.100 / 4. 10.100 libpostproc 57. 1.100 / 57. 1.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\xampp\htdocs\360_backend\storage\app\public\videos\sample.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 creation_time : 1970-01-01T00:00:00.000000Z encoder : Lavf53.24.2 Duration: 00:00:05.31, start: 0.000000, bitrate: 1589 kb/s Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1205 kb/s, 25 fps, 25 tbr, 12800 tbn (default) Metadata: creation_time : 1970-01-01T00:00:00.000000Z handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 384 kb/s (default) Metadata: creation_time : 1970-01-01T00:00:00.000000Z handler_name : SoundHandler vendor_id : [0][0][0][0]
可能的原因及解决办法
字体文件路径错误:
命令中fontfile=georgia.ttf使用相对路径,Laravel后端的运行目录(Web服务器进程的工作目录)与终端不同,导致FFmpeg找不到字体文件。
解决:改为绝对路径,例如fontfile=C:\Windows\Fonts\georgia.ttf(需确认字体存在)。转义字符解析问题:
PHP的exec对转义引号\"的处理逻辑和终端有差异,可能导致drawtext参数解析失败。
解决:改用双引号包裹整个drawtext参数,内部文本用单引号,调整后的命令示例:C:\ffmpeg\ffmpeg -i C:\xampp\htdocs\360_backend\storage\app\public\videos\sample.mp4 -filter_complex "drawtext=x=640:y=360:fontsize=24:fontcolor=white:fontfile=C:\Windows\Fonts\georgia.ttf:text='test.txt'" -c:a copy C:\xampp\htdocs\360_backend\storage\app\public\videos\testtt3.mp4 2> C:\xampp\htdocs\360_backend\storage\app\public\videos\out.txt权限不足:
Web服务器进程(如Apache的httpd.exe)没有访问字体文件或输出目录的读写权限。
解决:检查并授予Web服务器用户对目标字体路径和视频输出目录的读写权限。进程阻塞:
exec默认等待进程结束,若FFmpeg输出过大或需要交互可能导致阻塞。
解决:尝试使用shell_exec替代,或在Windows下添加start /B让进程后台运行,调整命令为:start /B C:\ffmpeg\ffmpeg -i C:\xampp\htdocs\360_backend\storage\app\public\videos\sample.mp4 -filter_complex "drawtext=x=640:y=360:fontsize=24:fontcolor=white:fontfile=C:\Windows\Fonts\georgia.ttf:text='test.txt'" -c:a copy C:\xampp\htdocs\360_backend\storage\app\public\videos\testtt3.mp4 2> C:\xampp\htdocs\360_backend\storage\app\public\videos\out.txt
内容的提问来源于stack exchange,提问作者Bogdan
相关产品推荐
相关产品推荐

