利用指令抓出影片檔裡的某畫面當 Screenshot

為什麼要這樣作?其實是因為如果你寫在 php 裡或是想要一次取大量的 screenshot 的話,哪用指令模式是比較方便的,以下提出三種方法來作抓圖的工作。不過只有方法二或是方法三是比較可以實行的方法,方法一其實只是一種模擬輸入的方法。

另外有些相簿軟體遇到動畫檔,所顯示出來的只是一個代表動畫檔的圖示,如果利用這些方法,可以讓他先顯示一個預覽圖示在縮圖上。

方法一: 使用 mplayer 配合 bash 的指令,延遲幾秒後,自動按下抓圖鍵。這個方法的缺點為,不能自行命名抓下來的圖檔檔名,但是只要是 mplayer 能放的檔,都能使用這個方法。 [code] $ (sleep 1;printf s)|mplayer -vf screenshot CCF17-1.rmvb -vo null //sleep 秒數;輸出抓圖指令|mplayer -vf screenshot videofile -vo 不輸出畫面 [/code]

方法二: 利用 ffmpeg 作抓圖的動作。這個轉檔程式有些目前比較新的 codec 並沒有支援,如 wmv9 和 rmvb ,所以如果沒有用到這幾個 codec 的話,可以使用這個方法。 [code] $ ffmpeg -i Fedex.wmv -s 320x240 -vframes 1 -ss 6 -f mjpeg output.jpg // ffmpeg -i inputfile -s 轉出來的圖檔長寬 -vframes 1 -ss 位移秒數 -f mjpeg output.jpg [/code]

方法三: 一樣是利用 mplayer 不過需要經過二個步驟,並且無法自定檔名。不過可以支援同樣 mplayer 支援的檔案格式,並且不用考慮任何的 bash 和 delay 的問題。 [code] $ mencoder -ss 0 -endpos 0.001 -ovc copy -nosound inputfile.avi -o tmp.avi // 先抓出位移 0 中的 0.001 秒的動畫,並且輸出到 tmp.avi 上 $ mplayer -nosound -vo jpeg tmp.avi // 把圖轉成 jpeg $ rm tmp.avi // 移掉暫存用的檔 [/code]

從以上三種方法來看,方法三是最好的方法,支援的各種格式,又不會有任何的處理上的暇疵,到時把他寫成 script 就可以很方便的使用了。