2016-12-06 87 views
1

FFmpeg使用的實際線程數與我使用-threads參數傳遞的數不一致。當使用線程時,FFmpeg使用的線程數比我預期的要多。

我已經在我的MacBook Air(有4個內核)和我有2個內核的VM上運行測試。兩臺機器使用的線程數量是一致的。

使用單線程返回我所期望的:使用1個線程。

$ ffmpeg -threads 1 -i clip.mp4 -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 

$ cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  1 

如果我設置的輸入-threads選項,它增加用於3.本線程的數量有點對我來說很有意義,因爲輸入將使用2個線程和輸出將使用一個單獨的線程。

$ ffmpeg -threads 2 -i clip.mp4 -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 

$ cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  3 

這是我開始感到困惑的地方。相反,如果我將輸入-threads設置爲1,並將輸出-threads設置爲2,則它使用8個線程(不像我所期望的那樣是3)。

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 

cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  8 

如果我添加的第二輸出與-threads 1,它不會增加使用的線程數。

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 \ 
           -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 250k -vf scale=250:-2 -y clip-250.mp4 

cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  8 

然而,如果第二輸出還指定兩個線程,線程數跳到15.

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 \ 
           -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 250k -vf scale=250:-2 -y clip-250.mp4 

cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  15 

每個增量凸點以外-threads 2將使用一個額外的3個線程(例如threads 2使用8,threads 3使用11,threads 4用途14.

所以它看起來像任何時候你使用-threads 2公式是這樣的:

1 + [ (1 + (3 * output_n_threads)) + ... ] 

最終我的問題是爲什麼使用的實際線程數量與我指定的選項大相徑庭。

謝謝。

回答

5

簡答 - 這些選項並不完全符合您的想法。

朗的答案如下:

的FFmpeg總是有一個主線程,其承擔了大部分的處理。如果有多個輸入,還有用於多路分解的輸入線程(每個輸入1個線程);對於單輸入多路分解在主線程上完成。

在輸入端設置「線程N」(其中N> 1)啓用多線程解碼,可以爲支持它的每個解碼器產生N個附加線程。在你的情況下,視頻解碼器支持它並且音頻解碼器不支持它,因此它是3個線程 - 1個主線程+ 2個視頻解碼線程。

類似地,在輸出設定「線程N」使多線程過濾和編碼,這可以生成N個附加的線程爲每個FilterGraph動態(我認爲在較舊的ffmpeg版本,這是「高達每每個濾波器N個線程」),並且每個編碼器,其支持它。還有一個重要的警告 - 這隻適用於通過ffmpeg進行線程管理的編碼器; libx264不會這樣做 - 它將請求的線程數轉發給執行其自己的線程管理的x264庫。那麼x264可能會創建多達2 * N個線程(確切數量取決於許多編碼參數)。因此,對於具有單輸出的「線程2」,您將獲得1個主線程+ 2個線程的縮放器+至少2個線程的libx264。這仍然不會加起來你看到的num_outputs * (1 + num_threads)行爲,我很想知道附加線程來自哪裏,但希望我的答案解釋了爲什麼「線程2」選項不會將線程數增加2個。