Php 如何在ffmpeg中进行两次转换?

Php 如何在ffmpeg中进行两次转换?,php,ffmpeg,Php,Ffmpeg,我尝试了以下方法: $ffmpeg = "/path/to/ffmpeg"; $source = "/path/to/video/source.mp4"; $dest = "/path/to/video/dest.mp4"; $format = "%s > %s 2>&1 & echo $! >> %s"; $a_rate = "44100"; $a_bitrate = "96k"; $v_bitrate = "3000k"; $resolution =

我尝试了以下方法:

$ffmpeg = "/path/to/ffmpeg";
$source = "/path/to/video/source.mp4";
$dest = "/path/to/video/dest.mp4";
$format = "%s > %s 2>&1 & echo $! >> %s";
$a_rate = "44100";
$a_bitrate = "96k";
$v_bitrate = "3000k";
$resolution = "1280x720";
$outputfile = "/path/to/output.txt";
$pidfile = "/path/to/pid.txt";

exec(sprintf($format, $ffmpeg . " -i " . $source . " -vcodec libx264 -s " . $resolution . " -b " . $v_bitrate . " -pass 1 /dev/null && \ " . $ffmpeg . " -i " . $source . " -acodec libfaac -ar " . $a_rate . " -ab " . $a_bitrate . " -vcodec libx264 -s " . $resolution . " -b " . $v_bitrate . " -pass 2 " . $dest, $outputfile, $pidfile));
如果我只做一次传球,一切都很完美,但是试着做两次这样的传球是行不通的。正确的方法是什么

更新:

exec(sprintf($format, $ffmpeg . " -i " . $source . " -pass 1 -vcodec libx264 -s " . $resolution . " -b " . $v_bitrate . " -passlogfile " . $pass . " -f rawvideo -y /dev/null", $outputfile, $pidfile));
exec(sprintf($format, $ffmpeg . " -y -i " . $source . " -pass 2 -acodec libfaac -ar " . $a_rate . " -ab " . $a_bitrate . " -vcodec libx264 -s " . $resolution . " -b " . $v_bitrate . " -passlogfile " . $pass . " " . $dest, $outputfile, $pidfile));

问题是在后台使用
$format=“%s>%s 2>&1&echo$!>>%s”放置ffmpeg命令
导致它们同时运行,并且此时没有完成日志文件供第二个过程使用。单过程的后台工作很好,因为它没有依赖性,但我认为需要一个更复杂的解决方案来后台进行双过程转换。我计划使用排队系统。

两次编码要求您进行第一次编码,仅分析视频(例如,不考虑音频)。这些统计数据被记录到一个日志文件中,然后在第二遍中使用该日志文件生成实际的输出视频。搜索
-pass n
。这不是我在提供的代码中所做的吗?“不起作用”不是很有帮助。请参阅ffmpeg输出以了解实际错误消息(然后将这些消息添加到问题中)。尝试在编写脚本之前直接使用ffmpeg使实际的ffmpeg命令正常工作。我已经能够让它在第一次运行时创建日志文件,但它会在执行脚本后立即创建实际文件,并且文件大小保持为零。没有错误消息输出。我已经更新了我的问题。把你的PHP去掉,得到结果的命令/参数,然后发布到SuperUser.com上。