2013年4月15日 星期一

FFmpeg : 以 Webcam 來進行縮時攝影

今天和同事分享了以 Raspberry PI + streamer + mencoder 所製作的縮時攝影影片,有人問到如何製作,衍生出在 Windows 要用何種程式的問題。mencoder 由於是 MPlayer 中的一部份,有 Windows 的版本,但是 streamer 似乎只有 Unix like 的版本。找了一下,另外一個可以用來抓 Webcam 影像並重組成縮時影片的 FFmpeg 也有 Windows 的版本,試完了才對這個工具有了一番新的認識,只能說 FFmepg 這個自由軟體實在太強大了,有關影音的處理,不但功能繁多,而且還跨各種作業系統,下面就來看看如何以 FFmpeg 一手包辦由 Webcam 取得影像,並轉成縮時影片的方法。


下載與安裝

FFmpeg 的網站網址如下:


由於各種平臺安裝的方法各異,底下就 Windows 來說明:


下載:
  • 連到 FFmpeg 的網站
  • 點選上方選單中的「Download」
  • 找到「FFmpeg Windows Builds」,裡面有個「Zeranoe FFmpeg Builds.」的連結,按一下後進入。
  • 依需求點選「Download FFmpeg git-xxxxxxxx 32-bit Static」或是「Download FFmpeg git-xxxxxxxx 64-bit Static」。
依個人需求選 32bit / 64bit 下載
將下載回來的檔案儲存

解壓縮:

如果電腦已安裝了類似 7zip 、WinRar ......等解壓縮工具,打開下載回來的「ffmpeg-xxxxxxxxx-static.7z」,並將檔案解壓縮至想存放的地點,如果嫌麻煩,可以解壓縮到 C:\ ,並將解壓縮好的資料夾名稱更名為「ffmpeg」,這樣,以後使用 ffmpeg 的工具,打指令就可以直接用類似 c:\ffmpeg\bin\xxxxx 的語法,較好記(進階的用法是將 ffmpeg.exe 所在的路徑加入 PATH 的環境變數中更方便)。


解壓縮完,ffmpeg 裡應該會有個叫「bin」的資料夾,裡面的檔案有:
  • ffmpeg.exe:主角!影音的錄、轉......都靠它了。
  • ffplay.exe:播放程式。
  • ffprobe.exe:分析、偵測影音檔格式的工具。


如果是在 Linux 中,例如 Ubuntu、Debian、Raspberry PI ...... 中,我們可以執行底下的指令來安裝:
sudo apt-get update
sudo apt-get install ffmpeg


以 ffplay 測試 Webcam

ffmpeg 裡有個叫 ffplay 的播放器,我們可以用它來預覽 Webcam 的影像。

Windows 中,我們先打開附屬應用程式中的「命令列」,或是在「開始」中的「執行」中,以鍵盤輸入「cmd」後按 Enter 鍵也可以,然後就在命令列模式中輸入以下的指令(假設 ffmpeg 放在 c:\ffmpeg):
c:\ffmpeg\bin\ffplay -f  vfwcap -i 0
Linux 中就執行底下的指令(必須在 Console 下才能看到影像):
ffplay -f  video4linux2 -i /dev/video0

上面的指令:

  • -f :指定影像來源的格式,Windows 中用 vfwcap,而 Linux 則使用 vedeo4linux2。
  • -i :指定 Webcam 的裝置代號,Windows 中用 0,而 Linux 則使用 /dev/video0。
下完指令,如果成功,應該會出現 Webcam 拍到的畫面。



想結束預覽,就按鍵盤的「q」或是「Ctrl + c」來結束。

這一部份,無論是參數及結束程式的方法,ffplay 和後面會使用到的 ffmpeg 都相同。

如果確定可以看得到 Webcam 的畫面,並調整好要拍攝的角度,我們就可以準備用 ffmpeg 來儲存 Webcam 的畫面了。


儲存 Webcam 的影像


我們使用的工具是 ffmpeg.exe (Linux 中為 ffmpeg),為了讓影像檔案比較好管理,我們先在磁碟中建立一個名為 time-lapse 的目錄,並切換至新建的目錄。
mkdir time-lapse
cd time-lapse
接著就可以執行以下的指令每隔固定時間擷取 Webcam 拍到的影像

Windows :(假設 ffmpeg.exe 是在 c:\ffmpeg\bin 目錄中)
c:\ffmpeg\bin\ffmpeg -f vfwcap -i 0 -s 640x480 -r 1 -t 1800 %04d.jpg

Linux :
ffmpeg -f video4linux2 -i /dev/video0 -s 640x480 -r 1 -t 1800 %04d.jpg

上面使用到的參數如下:

  • -f 、-i :和 ffplay 一樣,Windows 與 Linux 必須用不同的設定。
  • -s 640x480:儲存的影像檔大小為 640x480。
  • -r 1:每秒中抓一張影像。
  • -t 1800:抓取 1800 次後停止,可以用冒號的格式來表示這裡用的參數是時間(例如 00:30:00 為抓三十分鐘才停)。
  • %04d.jpg:儲存的檔名格式為,使用四位數字(位數不足,在前面補零)再加上「.jpg」。


如果成功的話,應該可以在目錄中,看到 0000.jpg、0001.jpg、0002.jpg ...... 的影像檔一張張產生。照上面的設定,ffmpeg 會在 1800 秒(30 分鐘) 後自動停止,如果想手動中斷,可以按鍵盤的「q」或是「Ctrl + c」來停止。


製作影片

有了影像檔,接下來就可將它們重組成影片囉!在儲存影像的目錄中執行底下的指令

Windows:(假設 ffmpeg.exe 是在 c:\ffmpeg\bin 目錄中)
c:\ffmpeg\bin\ffmpeg -i %04d.jpg -s 640x480 -r 30 -vcodec mpeg4 -b:v 2160000 move.avi

Linux :
ffmpeg -i %04d.jpg -s 640x480 -r 30 -vcodec mpeg4 -b:v 2160000 move.avi

上面使用到的參數如下,可以依自己的需求修改參數值:

  • -i %04d.jpg:影像的來源檔名是 xxxx.jpg (前面有補零的四位數字加「.jpg」)。
  • -s 640x480:輸出的影片大小為 640x480。
  • -r 30 :輸出的影片每秒使用 30 個影格(30張影像),也稱為 30 fps。
  • -vcodec mpeg4:輸出的影片採用 mpeg4 的編碼。
  • -b:v 2160000:輸出的影片 bitrate 設為 2160000,數字愈大,畫質愈好。
  • movie.avi:將影片儲存為 movie.avi。


影像重組完成,照上面的設定,在目錄中應該會多出一個檔名為「movie.avi」,長度約一分鐘 (1800 / 30 = 60 秒) 的影片檔,接著我們就可以用類似 Media Player 的播放軟體來觀看成果囉!

當然囉~如果像我同事的需求是想用數位相機拍的照片來製作,只要先將照片重新命名成有順序的檔名(或是改「-i %04d.jpg」的參數),再進行最後的影片製作部份即可。


沒有留言:

張貼留言

 
© 2009. Design by Pocket