栗子現場直播 千篇一栗
有很多簡單的道理,若不是被遺忘,不是察覺不到,就是知易行難。

2009年3月21日 星期六

DonKat Video

  DonKat Video 是 DonKat 系列的新程式。和 DonKat 本身不同,它不是一個遊戲,而是一個影片製作器。

  如果要製作自家太鼓譜影片,舊有的方法,是先開啟一個太鼓程式,例如 owata 或 DonKat ,然後再開一個 screen capture 的程式,把過程錄下來。這個方法有以下缺陷:

  • 太鼓程式和錄製器,都會同時用到大量 cpu 。如果其中一方 lag 掉,就會影響到輸出的質素。
  • 畫面有自己的 fps ,太鼓程式有自己的 fps ,甚至 screen capture 程式也有自己的 fps 。這三個 fps 往往都未能好好地同步,以致影響輸出的質素。
  • 畫面大小,受制於太鼓程式及錄製器。
  • 我討厭 owata 。

  而 DonKat Video 有以下的好處:

  • 即使 cpu lag 掉,也不會影響輸出質素。即使 cpu 只是 486 年代,如果時間充足,記憶體充足,也能得到相同質素的影片。
  • 不論輸出的影片是哪個 fps ,都能作出極度精準的畫面輸出。它的精準度甚至勝過 DonKat 遊戲程式。因為它是根據畫面顯示時間來繪畫畫面。
  • 畫面大小,對 YouTube 進行優化(720p)。喂,你不放上 YouTube 的話,你弄影面來幹啥?(好啦好啦,遲些也把畫面大小設定都加進去吧,1080p的太鼓啊...)
  • 不需要再對著那個沒有鼓音,判定太大,同步處理差勁的某flash程式。

  現在說說 DonKat Video 的運作原理。



  簡單說一說這幅圖。綠色的是輸入的檔案,有音樂檔 bgm.mp3 ,和鼓譜檔 data.txt 。紅色的是輸出的檔案,就是 video.mp4 。而白色的是中途的資料,它們會在製作 mp4 時會被暫時儲存在記憶體或硬碟裡。
  而資料和資料之間,主要是由兩種程式去做轉換: Java 和 ffmpeg 。在圖中,黑色的箭咀線是 Java ,而藍色的是 ffmpeg 。 ffmpeg 主要是做轉碼的工作,例如 mp3/x264 編碼轉換。而 Java 主要是做資料處理工作,例如在音樂上加鼓音,又或者是繪畫畫面。
  於是,如圖經過一堆資料轉換,就會生出一段太鼓影片。在整個過程中,有幾點我要在這裡說一說。

  首先是 ffmpeg 和 Java 的交合問題。一般我們如果想在 Java 裡 run console 程式,都會使用 Runtime.exec ,然後再用 Process.getXxxStream 去做 IO 。但是, ffmpeg 有一個叫人討厭的地方,它會在 error stream 中不斷寫字及倒退,導致 Java 不能處理其輸出。如果 error stream 的東東不處理, ffmpeg 就會呆掉。而 ffmpeg 本身不設 option 去關掉這些輸出。
  網上有很多 forum 和 blog ,都討論過這個問題。其中一個比較簡單的方法,是在 java 裡另開一個 cmd.exe ,在裡頭才執行 ffmpeg 。

  另外,就是 raw video 輸出的問題(1)。 raw video 的大小,計算起來實在是很誇張,以 1280x720 30fps 24bit/px 來計算,會是 88MB/s ,三分鐘的片子要 15GB 。因此必需要用 streaming 。而 ffmpeg 能夠從 input stream 讀取 raw video 去進行轉換。 raw video 的格式只是一堆簡單的 rrbbgg 數據,不包含 size 及 fps 之類的資料。在 ffmpeg 中設定 vcodec 為 rawvideo ,並設定 pix_fmt / frame rate / size ,就可以進行轉換。

  就畫圖速度方面,由於現時程式的優化不理想,所以在 E6600 裡只能做到 4fps 。現在正想辦法改善。

  最後要說的是 YouTube 的問題。

  YouTube 在影片上載時,會給出一些指引,例如 HD 的片子要做到 720p 之類。但在 fps 裡,卻說得不很清楚。指引有說過 24/25 fps ,但說明說的是 30 fps 。一怒之下,放了幾條不同 fps 的片子去試。



  比較奇怪的是 15fps ,畫面比較矇。另外,除了 15fps 以外,其他的片子在非 HD 顯示時都有速度不穩定的問題。

  另外,畫面播放似乎沒有用到 dual core 的力量。在播 30fps HD 時, E6600 單 core load 上頂,而且也會有 vsync 的問題,似乎播放器本身也有樽頸。
  60fps 原檔可以在這裡下載。你會看到和 Youtube 有很大的不同。

1 則留言:

Ben Lau 提到...

這是個不錯的功能啊!