神馬16核的服務器你讓我單線程跑ffmpeg


周末了,也該把上周工作中用到的雕蟲小技整理下,寫成博客,也方便我以后查閱。

最近需要用ffmpeg進行視頻轉碼,考慮到ffmpeg這個工具本身支持多線程,而服務器也是多核的,想最大程度發揮服務器的計算能力。顯然不能用單線程了,但是線程並不是越多越好,需要找到個平衡點。這就需要用time命令進行計時,並將該屏幕的輸出重定向到文件,以便后期進行分析。

ffmpeg編碼的介紹網上有很多,我這里也有些示例(http://www.cnblogs.com/MikeZhang/archive/2012/07/17/videoCodec.html 的“三、視頻編碼工具 ”中有介紹)。今天主要介紹下ffmpeg的轉碼,以及time命令的重定向問題。

假設我這里有個in.mp4的視頻文件,分辨率為640*480,碼率為580kbps,需要降低分辨率為320*240,降低碼率為290kbps(這個參數和分辨率同時使用時不一定起作用,特別是中途退出時)。

普通降低分辨率,碼率的命令:

ffmpeg -y -i in.mp4 -s 320x240 -b 290000 out290.mp4

thread參數的命令:

ffmpeg -y -threads 2 -i in.mp4 -s 320x240 -b 290000 out290.mp4

這里用了兩個線程。

time統計時間的命令:

time ffmpeg -y -threads 2 -i in.mp4 -s 320x240 -b 290000 out290.mp4

輸出重定向命令:

(time ffmpeg -y -threads 2 -i in.mp4 -s 320x240 -b 290000 out290.mp4) 2>1.txt

由於輸出為標准出錯,所以這里用2>1.txt

當然也可使用如下命令:

(time ffmpeg -y -threads 2 -i in.mp4 -s 320x240 -b 290000 out290.mp4) >& 1.txt

為了同時在屏幕上輸出,可以用tee命令。首先將標准出錯重定向到標准輸出,然后通過通道傳給文件,命令如下:

(time ffmpeg -y -threads 2 -i in.mp4 -s 320x240 out290.mp4) 2>&1 | tee 1.txt

如果想測試下服務器到底支持多少個線程比較好,就需要寫個腳本運行,我這里有一個,僅供參考:

#! /bin/bash

echo "Input num : "
read num
for (( i=1; i<=$num; i=i+1 ))
do
        #(time ffmpeg -y -threads $i -i in.mp4 -s 320x240 -vcodec libx264 -vpre fast out290.mp4) >& $i.txt
        (time ffmpeg -y -threads $i -i in.mp4 -s 320x240 -vcodec libx264 -vpre fast out290.mp4) 2>&1 | tee $i.txt
done

好吧,啟動腳本,讓服務器飛一段時間,到時用tail命令看結果就是了。

好,就這些了,希望對你有幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM