2013年4月14日 星期日

Raspberry PI : Webcam + streamer + mencoder 製作縮時影片

Raspberry PI 加上 Webcam 也可以拿來玩縮時攝影,影像的抓取可以用之前提過的 motion 、 ffmpeg 或是這一次要用的 streamer 每隔幾秒拍一張,而將影像組合成影片的工具則可以使用 ffmpeg 或是 MPlayer 的編碼工具 mencoder 。


安裝軟體

這一次打算使用 streamer、mencoder 及 ffmpeg ,所以先執行底下的指令來安裝軟體:
sudo apt-get update
sudo apt-get install streamer
sudo apt-get install mencoder
sudo apt-get ffmpeg
其中的 mencoder 如果曾安裝過 mplayer 的話,應該已安裝好了。


抓取影像

在 Raspberry PI 如果按預設值,可能會由於 buffer 不夠大而無法執行 streamer。可能出現類似底下的訊息:

libv4l2: error allocating conversion buffer
mmap: Cannot allocate memory


我們可以先執行底下的指令來解決:
sudo sysctl vm.overcommit_memory=1

為了方便管理,先建一個目錄,並切換到該目錄中後,再執行 streamer 來抓影像:
mkdir time-lapse
cd time-lapse
streamer
streamer -o 0000.jpeg -s 640x480 -j 70 -t 500 -r 1
上面的指令,關於 streamer 的參數設定如下:

  • -o 0000.jpeg :以四位數字由 0000 開始命名,並用 JPEG 的格式儲存。
  • -s 640x480:用 640x480 (VGA) 的解析度。
  • -j 75:JPEG 的品質設為 75%
  • -t 500:抓取 500 張就停止,這個參數也可以設為時間的格式。
  • -r 1:每一秒鐘抓一張影像。

這一次的實驗,Webcam 用的是 p2v ,它可以抓到 1024x768 的解析度,不過,對 Raspberry PI 來說,似乎太吃重了,試了幾次,都沒到達預定的張數就結束,因此,將解析度降為 640x480 才順利拍完。

如果成功,我們可以在目錄中看到一堆類似 0000.jpeg、0001.jpeg、0002.jpeg ...... 的影像檔,接著就可以準備把它們組合成影片了。


製作影片

接下來的工作是把一張張的影像檔依序按我們指定的影格數、畫質及編碼......等,轉換成影片。底下用 mencoder 來完成最後的動作:
mencoder -nosound mf://*.jpeg -mf w=640:h=480:type=jpeg:fps=30 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2160000:v4mv -o movie.avi
上面的參數解說如下:

  • -nosound:不加聲音。
  • mf://*.jpeg:在目錄中找出所有的 .jpeg 的影像檔。
  • -mf w=640:h=480:type=jpeg:fps=30 :設定輸出的參數
    w=640 輸出的影片寬
    h=480 輸出的影片高
    type=jpeg 輸入的影像格式(可用的有 jpeg、png 及 tga)
    fps=30 輸出的 fps
  • -ovc lavc:輸出的影像採 lavc (libavcodec) 編碼方式(可以執行 mencoder -ovc help 查詢可用的編碼方式及代碼)。
  • -lavcopts vcodec=mpeg4:vbitrate=2160000:v4mv:設定 libavcodec編碼的額外參數
    vcode=mpeg4:採用 DivX 4/:5 編碼。
    vbitrate=2160000:將 video bitrate 設為 2160000,數字愈大,畫質愈好。
    v4mv:這定這個參數可以讓畫質稍好一點。
  • -o movie.avi:設定影片檔的檔名。

這部份其實也可以用 ffmpeg 來進行,對應的指令如下:
ffmpeg -i %04d.jpeg -s 640x480 -r 30 -vcodec mpeg4 -b 2160000 move.avi
另外,如果想要把影片加入聲音的部份,可以將前面 mencoder 中的「-nosound」置換為「-audiofile train.mp3 -oac copy」,改為底下的:
mencoder -audiofile train.mp3 -oac copy mf://*.jpeg -mf w=640:h=480:type=jpeg:fps=30 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2160000:v4mv -o movie.avi
多的參數如下:

  • -audiofile train.mp3:加入的聲音檔檔名為 train.mp3。
  • -oac copy:輸出時,聲音的編碼和來源一樣。


最後來看看我用 p2v 在 Raspberry PI 上,每秒鐘抓一張 640x480 的影像,將 500 張影像組合而成的縮時影片:

今天在試時,特別將 Webcam 插在有獨立電源的 USB Hub 上,而不是直接吃 Raspberry PI 的 USB 電力,主要是之前有好幾次在插拔 USB 裝置時當機,而且讓 SD 卡上的資料部份損毀而重灌,懷疑是否電力不足在作怪,雖然已有備份,還是小心一點的好。另外,Webcam 的部份,因為在拍小孩,加上 p2v 可以自動對焦,我把它改為手動對焦,並在一執行 streamer 後,馬上按一下對無鈕,不然,拍出來的可能會是模糊的。


2 則留言:

  1. 能不能在RaspberryPI裏播放AVI檔,例如系統是Raspbian

    回覆刪除
    回覆
    1. 如果 AVI 的 codec 是 MPEG-2 , 沒有加買 license key 的話, 會看不到畫面, 購買的頁面在官網中
      http://www.raspberrypi.com/

      刪除

 
© 2009. Design by Pocket