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)) + ... ]
最終我的問題是爲什麼使用的實際線程數量與我指定的選項大相徑庭。
謝謝。