爆料 June 28
今天早上在公司的 mailing list 上看到 Life at Google – The Microsoftie Perspective 這,後來看到「Google離職員工爆料 「免費」背後有代價」這篇的整理,覺得有種莫名奇怪的感覺。我看原文的時候,明明覺得他寫得還滿正面的,至少不是這篇全部都是批評。怎麼翻成中文會差這麼多 XD
今天早上在公司的 mailing list 上看到 Life at Google – The Microsoftie Perspective 這,後來看到「Google離職員工爆料 「免費」背後有代價」這篇的整理,覺得有種莫名奇怪的感覺。我看原文的時候,明明覺得他寫得還滿正面的,至少不是這篇全部都是批評。怎麼翻成中文會差這麼多 XD
為了做 MULTIMEDIA ANALYSIS AND INDEXING 這門課的 project,我們這組需要從 MPEG video 裡面取出 motion vector(它在 MPEG video 裡的用途是用來做壓縮。一個物體在畫面裡面移動時,其實只需要描述它的位移,而不需整個重新 encode)。
不知道是不是因為大部分的人需要的都是 video 的 frame,而不是 motion vector(其實在解壓縮時只差一步),我 google 了好久都找不到工具可以用。後來發現 ffmpeg 的 ffplay 可以直接把 motion vector 邊撥邊畫出來,但是還是沒辦法 dump 出來。
$ ffplay -vismv 3 xxx.mpg
vismv 那個參數其實是三個 bit,第一個 bit 代表 P-Frame,第二個代表 B-Frame 的 forward motion vector,第三個 bit 則是 B-Frame 的 backward vector。
不過,這只能看。所以我參考 Using libavformat and libavcodec 跟 ffplay 的 source code 寫了一個程式。這個程式可以把 video 每個 frame (除了沒有 motion vector 的 I-Frame)的 motion vector 取出來。如果要改成取第幾個 frame、或是某個 range 之類的,也很好改。
g++ compile 時需要加上 -lavcodec -lavformat 兩個參數,當然也要先裝上 libavcodec 跟 libavformat 兩個 library。有裝 ffmpeg 就會有。
在 Perl 裡面如何把這種程式平行化? 假設每次 interation 是獨立的。
foreach $data (@all_data) {
eat_cpu($data);
}
超簡單
use Parallel::ForkManager; # !!
$pm = new Parallel::ForkManager($MAX_PROCESSES);
foreach $data (@all_data) {
$pid = $pm->start and next;
eat_cpu($data);
$pm->finish;
}