2012-07-30 15 views
0

我曾嘗試以下:你如何在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 = "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)); 
+0

兩遍編碼要求您首先分析視頻(例如,不考慮音頻)。這些統計數據被記錄到一個日誌文件中,然後在第二遍中使用它來產生實際的輸出視頻。:http://ffmpeg.org/ffmpeg.html。搜索'-pass n'。 – 2012-07-30 04:37:53

+0

這不是我在我提供的代碼中所做的嗎? – user1461465 2012-07-30 04:42:30

+1

「不起作用」不是很有幫助。請參閱ffmpeg輸出中的實際錯誤消息(然後將這些消息添加到您的問題中)。嘗試在嘗試編寫腳本之前直接使用ffmpeg來獲得實際的ffmpeg命令。 – LordNeckbeard 2012-07-30 19:16:53

回答

0

的問題是把ffmpeg的命令在後臺與$format = "%s > %s 2>&1 & echo $! >> %s";使他們都在同一時間運行,並在那個時候有沒有日誌文件完成後,第二道使用。由於背景沒有依賴關係,背景效果可以很好地發揮作用,但是我認爲需要一個更爲複雜的解決方案來背景兩次傳遞轉換。我打算使用排隊系統。