2011-07-26 59 views
1

所有文件轉換目錄我怎麼環路直通的視頻文件與擴展。FLV和使用EXEC一個目錄,他們中的每一個(一次一個)轉換爲使用MPG的ffmpeg -i original.avi final.mpgPHP的exec使用的ffmpeg

在當前文件正在轉換時,數組中的下一個文件名應該等待,直到執行完成,然後再繼續轉換並轉換數組中的其他文件名。

我知道我可以使用scandir($dir)使所有文件名的數組,那麼也許使用拆分僅定位.flv文件。這是做這件事的最好方法。如果我使用while循環來運行每個文件名並對其執行exec操作,那麼在移動到數組中的下一個文件之前,如何確保exec文件已完全轉換。

回答

6
$dir='/path/to/dir'; 
$bash_commands = 'cd "'. $dir .'" 
for i in *.flv; do 
    OUTFILE=$(basename "$i" .flv).mpg 
    ffmpeg -i "$i" -f mpg "$OUTFILE" 
done'; 
exec($bash_commands); 

bash代碼的解釋:

  1. 第一行與該命令cd改變當前工作目錄。
    參見:Moving around the filesystem @ tldp.org
  2. 第二行開始一個for循環,重複它裏面的代碼,而$i變量包含從當前工作目錄即以下圖案的文件的名稱:*.flv。每次迭代都會將$i的值更改爲當前工作目錄中的下一個文件名。
    請參閱:The for loop @ tldp.orgLoops @ tldp.org
  3. 第三行將值$(basename "$i" .flv).mpg分配給名爲OUTFILE的變量。
    參照:Subshells @ tldp.orgbasename @ tlpd.orgCommand Substitution @ tlpd.org
  4. 第四行啓動ffmpeg並告訴它將$i中的文件轉換爲名爲$i的文件,但後綴更改爲「mpg」而不是「flv」。 (「後綴更改」在第三行完成)
  5. 第五行結束for循環。

下面列出的是PHP的等價的:

chdir('/path/to/current/working/dir'); 
foreach (glob("*.flv") as $filename) { 
    $OUTFILE = substr($filename, 0, -3) . 'mpg'; 
    exec('ffmpeg -i "'.$filename.'" -f mpg "'.$OUTFILE.'"'); 
} 

參見:glob()chdir()substr()

+0

謝謝,這看起來不錯,但我不太熟悉Linux bash命令。你能解釋一下bash命令是如何專門處理OUTFILE =部分的。 * .flv後的分號是否正確。該命令如何知道一次只處理一個文件,所以ffmpeg不會一次完成所有文件。我們可以用純php做到這一點 – Pinkie

+0

@Pinkie:看我的編輯。 – Dor

+0

bash命令解決方案給了php語法錯誤。 php解決方案效果很好。我嘗試了一個包含50個視頻的文件夾的解決方案。我想通過關閉瀏覽器窗口循環播放視頻的過程會被殺死,但最終轉換了所有50個視頻。你知道殺死整個過程的簡單方法嗎? – Pinkie