周末了,也該把上周工作中用到的雕蟲小技整理下,寫成博客,也方便我以后查閱。
最近需要用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命令看結果就是了。
好,就這些了,希望對你有幫助。