2014-08-28 127 views
1

我試圖上E3-1245 V2 3.40GHz CPU視頻編碼的(使用X264編解碼器),32 GB RAM,2TB 7200RPM磁盤(軟RAID 1)的Debian 6服務器找到瓶頸。 Ffmpeg不使用4核心8線程CPU的800%。爲什麼?

E3-1245 V2具有4個核/ 8個線程,但ffmpeg無法全部使用800%,並且每個實例使用大約200%。

我看了很多其他的線程,人們總是說「在並行模式下運行幾ffmpeg的過程」

但是,在實際上是在一個ffmpeg的實例中的瓶頸? CPU總線/ RAM頻率。速度

exec ("/usr/bin/ffmpeg -i " . $fullpath . ' -pass 1 -passlogfile  
/var/www/scripts/twopass2.log -refs 1 -threads 0 -vcodec libx264 -bsf h264_mp4toannexb 
-s 1280x720 -aspect 16:9 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264opts 
"keyint=48:min-keyint=48:scenecut=0:stats=/var/www/scripts/stats2.log" -b:v 2300k -bf 0 
-profile:v baseline -mixed-refs 0 -level 30 -maxrate 80M -bufsize 80M -acodec aac - 
async 1 -pix_fmt yuv420p -f mpegts -strict -2 -ar 44100 -b:a 128k -map 0 -dn -sn -y 
/dev/null'); 

exec ("/usr/bin/ffmpeg -i " . $fullpath . ' -pass 2 -passlogfile 
/var/www/scripts/twopass2.log -refs 1 -threads 0 -vcodec libx264 -bsf h264_mp4toannexb 
-s 1280x720 -aspect 16:9 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264opts 
"keyint=48:min-keyint=48:scenecut=0:stats=/var/www/scripts/stats2.log" -b:v 2300k -bf 0 
-profile:v baseline -mixed-refs 0 -level 30 -maxrate 80M -bufsize 80M -acodec aac - 
async 1 -pix_fmt yuv420p -f mpegts -strict -2 -ar 44100 -b:a 128k -map 0 -dn -sn - 
flags -global_header -f segment -segment_format mpegts -segment_time 10 - 
segment_list /dev/null -y ' . $idpath . '2/%5d.ts'); 

我覺得有demuxing的問題,但不知道。

而且我想是這樣的:

mkfifo pipe.y4m 
ffmpeg -i input.mp4 -f yuv4mpegpipe -y pipe.y4m 
and run 
x264 -o dvd1.264 pipe.y4m 

CPU利用好一點(約150%的ffmpeg和350% - X264),而且這是不是800%的。

任何方式來加快編碼? 那裏真的存在瓶頸?

+0

您是否設置線程數?很難告訴這麼少的信息。我敢打賭IO。如果你平行運行,會發生什麼? – 2014-08-28 14:07:58

+0

是的。我也嘗試了-thread 0; -threads auto和-threads 8,但ffmpeg不在乎。什麼都沒有發生,但現在在生產服務器上是個問題。 – user3652819 2014-08-28 14:18:00

回答

1

答案編輯:

@ user3652819如果與線程支持編譯你的ffmpeg打造,-threads選項應該工作。如果即使使用-threads,ffmpeg也不能使用CPU的能力,這意味着某些編碼或解碼算法不夠可並行化。讓我解釋一下這個並行化問題:

攜帶獨輪車的沙子是一個完全可並行的工作。您可以儘可能多地使用手推車。讓一些人上公共汽車並不是一項可並行的工作。人們必須逐個進入。

我通常運行更多的ffmpeg實例來處理更多的文件來使用我的空閒CPU能力。

舊文章:

一些編解碼算法的您正在使用的輸入或輸出可能不夠並行。什麼是您使用的輸入文件?當您使用libx264編碼文件作爲輸入時,此問題是否仍然存在?

+0

這個答案應該是一個評論(但也許你沒有足夠的聲望點?)。 – LordNeckbeard 2014-08-28 17:10:15

+0

在輸入我有h264(高配置文件)yuv420p,1920x1080,2001 kb/s,50 fps,在MP4容器 – user3652819 2014-08-28 20:04:53

+0

@ user3652819如果您的ffmpeg生成與pthread支持編譯,-threads選項應該工作。如果即使使用-threads,ffmpeg也不能使用CPU的能力,這意味着某些編碼或解碼算法不夠可並行化。讓我解釋一下這個並行問題: 攜帶獨輪手推車是一個完全可並行的工作。您可以儘可能多地使用手推車。 讓一些人上公共汽車並不是一項可並行的工作。人們必須逐個進入。 我處理多個文件使用我的空閒CPU電源運行多個實例。 – user2925649 2014-08-28 23:05:37