PHP调用FFmpeg无法保存视频至Windows系统临时文件夹求助
问题描述
将视频转换为H.264格式时,可正常保存至普通用户目录,但保存到Windows临时文件夹(C:\Windows\Temp)时失败;视频快照能成功保存至该临时文件夹,无法定位问题。
代码示例
require_once(dirname(__FILE__).'/../vendor/autoload.php'); function get_ffmpeg_exe_path_arr_def(){ return( array( 'ffmpeg.binaries' => "C:/bin/ffmpeg.exe", 'ffprobe.binaries' => "C:/bin/ffmpeg.exe", 'timeout' => 3600000000, 'ffmpeg.threads' => 12 ) ) ; } $vid_inp = 'C:/Users/Jordan/Downloads/motorboat_org.mp4' ; $vid_out = 'C:/Users/Jordan/Downloads/motorboat_9.mp4' ; $tmp_vid_out_file = tempnam(sys_get_temp_dir(), "Vid") ; //C:\Windows\Temp\VidA318.tmp $tmp_img_file = tempnam(sys_get_temp_dir(), "Img") ; //C:\Windows\Temp\ImgA234.tmp $ffmpeg = FFMpeg\FFMpeg::create( get_ffmpeg_exe_path_arr_def() ); $video = $ffmpeg->open($vid_inp); $format = new FFMpeg\Format\Video\X264('aac', 'libx264'); $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(0.2))->save($tmp_img_file); // 快照可正常保存至 C:\Windows\Temp\ImgA234.tmp $video->save($format, $vid_out); // 视频可正常保存至 C:/Users/Jordan/Downloads/motorboat_9.mp4 $video->save($format, $tmp_vid_out_file); // 无法保存视频至 C:\Windows\Temp\VidA318.tmp
错误信息
Fatal error: Uncaught exception 'Alchemy\BinaryDriver\Exception\ExecutionFailureException' with message 'ffmpeg failed to execute command "C:\AppServ\www/ecity/bin/windows/ffmpeg.exe" -y -i "C:/Users/Jordan/Downloads/motorboat_org.mp4" -threads 12 -vcodec libx264 -acodec aac -b:v 1000k -refs 6 -coder 1 -sc_threshold 40 -flags +loop -me_range 16 -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -trellis 1 -b:a 128k -pass 1 -passlogfile "C:\WINDOWS\TEMP\ffmpeg-passes66557e75d5e53hbzbo/pass-66557e75d6e0b" C:\Windows\Temp\VidEA8F.tmp: Error Output: ffmpeg version 4.3.2-2021-02-27-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers built with gcc 10.2.0 (Rev6, 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-lzma --enable-libsnappy --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-li in C:\AppServ\www\ecity\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\Media\AbstractVideo.php on line 106
问题原因
从错误日志可看出,PHP-FFmpeg默认使用2-pass编码,编码时会尝试在系统临时目录下创建子目录(如ffmpeg-passes66557e75d5e53hbzbo)存储pass日志文件,但运行PHP的进程(如Apache、IIS或CLI进程)没有权限在C:\Windows\Temp下创建该子目录,导致编码失败。而视频快照保存不需要多pass编码,因此不会触发这个权限问题。
解决方案
1. 禁用2-pass编码(单pass模式)
修改X264格式配置,强制使用单pass编码,避免生成pass日志文件:
$format = new FFMpeg\Format\Video\X264('aac', 'libx264'); $format->setPasses(1); // 设置为单pass编码
2. 指定自定义pass日志目录
手动指定一个PHP进程有写入权限的目录存储pass日志,比如用户个人目录:
$format = new FFMpeg\Format\Video\X264('aac', 'libx264'); // 设置日志目录为用户下载文件夹,确保有写入权限 $format->setPassLogDirectory('C:/Users/Jordan/Downloads/');
3. 给系统临时目录添加权限
检查运行PHP的进程身份,给C:\Windows\Temp目录添加该进程的创建子目录和写入文件权限,之后重试编码操作。
内容的提问来源于stack exchange,提问作者user2818066
相关产品推荐
相关产品推荐

