2011-10-03 75 views
1

我有我的上傳腳本處理該文件的上傳,然後調用exec(ffmpeg的-i ......ffmpeg的電話,但不要等待它

我打電話ffmpeg的3倍,其中一個轉換到mp4,一個轉換爲wemb,另一個轉換爲縮略圖

問題是,如果調查人員上傳了所有他的素材,他不想坐在那裏等待它轉換,然後他可以做任何事情。我如何發送3個命令,然後退出腳本?

我也想運行exec(rm -r/path/to/original),所以原始視頻被刪除,但顯然我必須wa它可以在轉換完成之前完成

回答

5

您可以在命令後面使用&符號在後臺運行它,並立即獲得提示(控制)。

我建議創建一個bash腳本,如:

#!/bin/sh 
ffmpeg -i $1 -ab 64k -vb 420k $1.mp4 
ffmpeg -i $1 -ab 64k -vb 420k $1.webm 

然後從喜歡PHP運行:

system ('myscript.sh tempfile &'); 

下面的示例使用if結構來決定是否使用聲音或沒有。第一個參數是文件名,如果第二個參數等於0則mp4上沒有聲音,如果第三個參數爲零,則webm上沒有聲音。

#!/bin/sh 
if [ $2 -eq 0 ] 
then 
    ffmpeg -i $1 -an -vb 420k $1.mp4 
else 
    ffmpeg -i $1 -ab 64k -vb 420k $1.mp4 
fi 


if [ $3 -eq 0 ] 
then 
    ffmpeg -i $1 -an -vb 420k $1.webm 
else 
    ffmpeg -i $1 -ab 64k -vb 420k $1.webm 
fi 

您可以使用它從PHP這樣的:

system ('myscript.sh ' . $tempfile . ' ' . (0 + $mp4sound) . ' ' . (0 + $webmsound) . ' &'); 

...但要記住,你甚至可以啓動PHP文件,而不是一個shell腳本,如:

system ("php converter.php \"$tempfile\" \"$mp4sound\" \"$webmsound\" &'); 
+0

確定現在會怎樣我通過更多的變量,而不僅僅是像你在那裏列出的文件名?視頻編解碼器和大小保持不變,但我可以選擇包含音頻或不包含,所以我有一個名爲$ mp4Audio和$ webmAudio的變量。 – swg1cor14

+0

@ swg1cor14請參閱編輯。 – vbence

+0

好吧,我得到它使用shell_exec工作。只要使用exec,腳本仍然等待它完成 – swg1cor14

0

也許您可以將執行轉換的代碼移動到由cron作業調用的腳本中。

例如,用戶可以將視頻上傳到目錄,也可以將記錄插入包含所有未轉換視頻的數據庫表中。

然後cron作業每x分鐘運行一次,檢查數據庫中是否有未轉換的視頻,然後轉換它們。完成之後,腳本可以刪除原始視頻並從數據庫中刪除該行。

1
  • 處理文件上傳,並分別
  • 轉換文件已被上傳後,
  • 把它變成一個作業隊列
  • 運行該檢查最新的隊列每分鐘+如果當前正在處理作業的cron作業已完成,如果是的話就進行轉換。
  • 轉換後做的unlink(/路徑/到/原件)刪除原始視頻
  • 更新作業狀態

不知道它什麼意義,什麼我想的比你做一切事情立刻。 添加少許技巧來緩解面前的痛苦

1

嘗試在一頁中分別處理所有ffmpeg轉換。例如:convert.php

上傳完成。發送隱藏請求到convert.php?id = someid

在convert.php的頂部使用ignore_user_abort(TRUE); 即使用戶關閉瀏覽器,該進程也會運行。 如果用戶沒有關閉那個頁面仍然在那個頁面上,並且有Ajax響應更新狀態。

我希望它可以幫助拿個主意..

0

如果你在Linux上,尾隨符號在EXEC命令的運行() - 調用會在後臺啓動的過程。

你可能也想從ffmpeg的輸出重定向到/ dev/null的

ffmpeg -i (...) > /dev/null 2>&1 & 

同樣的方法可以用來調用一個shell腳本,如果你想轉換後進行清理。

相關問題