因此我使用 php exec 命令在我的 Linux 服务器上运行 ffmpeg 命令:
exec("(nohup nice -n 19 " . $ffmpegPath . " -y -i " . $srcFile . " -f mp4 -pass 1 -passlogfile " . $video_pass_log . " -vcodec libx264 -cpu-used 0 -threads 1 -profile:v baseline -vf \"movie=/var/www/vhosts/examplesite.com/httpdocs/images/ae-ffmpeg.png [logo]; [in] scale=".$srcWidth.":floor(ow*(".$srcWidth."/ow)/dar/hsub)*hsub+2[scale]; [scale][logo] overlay=main_w-overlay_w-1:main_h-overlay_h-1 [out]\" ".$options." -r 25 -g 25 -keyint_min 25 -b:v ".$bitrate."k -an " . $destFile . ".mp4 && " . $ffmpegPath . " -y -i " . $srcFile . " -f mp4 -pass 2 -passlogfile " . $video_pass_log . " -vcodec libx264 -cpu-used 0 -threads 1 -profile:v baseline -ac 2 -ab 128k -vf \"movie=/var/www/vhosts/examplesite.com/httpdocs/images/ae-ffmpeg.png [logo]; [in] scale=".$srcWidth.":floor(ow*(".$width."/ow)/dar/hsub)*hsub+2[scale]; [scale][logo] overlay=main_w-overlay_w-1:main_h-overlay_h-1 [out]\" ".$options." -r 25 -g 25 -keyint_min 25 -b:v ".$bitrate."k " . $destFile . ".mp4 && " . $mp4boxpath . " -tmp /tmp -isma -inter 500 " . $destFile . ".mp4 && rm -f " . $video_pass_log . "* && " . $ffmpegPath . " -y -i " . $srcFile . " -vcodec libvpx -cpu-used 0 -threads 1 -acodec libvorbis -vf \"movie=/var/www/vhosts/examplesite.com/httpdocs/images/ae-ffmpeg.png [logo]; [in] scale=".$srcWidth.":floor(ow*(".$srcWidth."/ow)/dar/hsub)*hsub+2[scale]; [scale][logo] overlay=main_w-overlay_w-1:main_h-overlay_h-1 [out]\" ".$options." -ac 2 -ab 128k -r 25 -g 25 -keyint_min 25 -b:v ".$bitrate."k -f webm " . $destFile . ".webm) > /dev/null 2>/dev/null &");
我很确定 ffmpeg exec 命令是没问题的,因为奇怪的是,如果我将转换后的视频的目标路径更改为我的网站上的“普通”文件夹,那么两个文件都会保存,这很好,但是当我将目标路径更改为我有安装文件夹的位置时,只有 webm 文件会保存。
所以我的“正常”文件夹位于http://examplesite.com/tmp/我的安装文件夹是http://examplesite.com/files/
很奇怪的是,webm 视频可以毫无问题地保存到已挂载的文件夹,而 mp4 视频却有问题……就像我说的,两个文件都保存到了“tmp”文件夹中
为了测试目的,普通文件夹和已挂载文件夹的权限均设置为 777,并且已挂载驱动器文件夹的权限与我的站点上的所有其他文件夹的权限相同。
关于如何修复此问题,我有什么想法吗?
答案1
在移除了 two pass 和 mp4 box 的情况下尝试 exec 命令后,一切正常。然后我单独尝试了 two pass,想知道这是否是 pass 日志文件的问题,结果也成功了。所以显然是 MP4Box 导致了这个问题。经过一番阅读,我发现 MP4Box 不会从一个分区保存到另一个分区。
警告:MP4Box 可能会在此临时目录中创建一个文件,然后将其重命名为输出名称。如果最终目标文件夹和临时文件夹不在驱动器的同一分区上,则 MP4Box 将无法重命名该文件。这适用于使用现有输入文件并将结果保存到同一文件的所有编辑操作(不使用 -out 开关指定不同的输出文件名)。
来源:http://gpac.wp.mines-telecom.fr/mp4box/mp4box-documentation/
我用于两次传递 ffmpeg 命令的 tmp 文件夹以及 MP4Box 与我的最终目标文件夹位于不同的分区上。