2009年11月6日 星期五

製作 Motion JPEG (Mjpeg) 影片 - 將連續的照片串成影片

如果有一連串稍稍變化的照片,好比如 100 張連續變化的照片,像運動比賽,甚至街景的變化等,有時就想把它弄成影片來玩玩。這時,若那些照片都是 jpeg ,那就有一些現成的工具可以拿來用囉。


關於 Motion JPEG 可以參考這些資訊:



在網路上隨手一查,不少可用的方式



以下在 Ubuntu 的環境先試了 mjpegtool



  • jpeg2yuv −f 25 −I p −j image%05d.jpg > result.yuv

  • jpeg2yuv −b 1 −f 25 −I p −n 60 −j image*.jpg | yuv2lav −o stream_without_sound.avi


發現它會要求 jpeg 的 width 要 16 的倍數



  • **ERROR: [jpeg2yuv] The image width isn't a multiple of 16, rescale the image


所以最後我用了 mencoder



  • mencoder mf://1.jpg,2.jpg,3.jpg -mf w=800:h=600:fps=1:type=jpeg -ovc copy -o out.avi

  • mencoder mf://%.jpg -mf w=800:h=600:fps=1:type=jpeg -ovc copy -o out.avi


其中 -ovc 和 -oac 分別代表要如何處理視訊跟聲音的動作,此例為 copy 不進行轉換。後來發現,原來 mencoder 還可以把網路上的串流(mms://)給轉換成影片呢!



  • mencoder mms://www.example.com/test.wmv -ovc copy -oac copy -o 輸出檔名

  • mms 的部份也可以接受 asf , wma 等格式,但這邊我就沒試,我主要是要玩 mjpeg 囉


參考資料



Facebook SPAM Quiz !

雖然這陣子開發一些簡單的 Facebook 的 Quiz 程式,但自己真的沒用玩過幾個 Quiz ,心血來潮是了兩個別人推薦的邀請,一玩下去才發現!開始有 SPAM 的味道了。SPAM就是擾人的廣告性的事物。


那些 Quiz 通常在第二頁列出制式的官方邀請函介面,但骨子裡卻已經幫你送出邀請函!若 Facebook API 等架構不變動的話,再不用多久,可能 SPAM Quiz 滿天飛,接下來就是沒人想再玩 Quiz 了。


2009年11月4日 星期三

發現...

無意間發現有人在轉錄我的文章?不過是比較像弄成書籤的網誌。


有人把我寫的文章的標題打在自己的 blog 上,然後再把該篇文章的上前面幾段內文貼上去。我本來是沒什麼在意,但如果考慮 Search Engines 的搜尋排名,那就會計較了,哈。


原本是去 Search 某個關鍵字看看會不會找到我的文章,然後才發現怎麼有人的文章跟我標題一模一樣?還出現部份內文?且比我排在前頭!比較好的做法是至少文章標題不要一樣嘛,多個 [轉錄] 不是很好嗎?因為我自己一開始去看那個網站時,真的會以為那些文章都是對方寫的,每一篇雖然文章底部有標明 Source 的字樣,但仍不是很明顯。


之所以會有不好的感觸是因為前陣子我在找某個主題的相關文章,恰巧也發現 A 先生的文章也被 B 先生這樣處理( A 文章內容被 B 先生複製貼上),雖然多少有標明來源,但文章標題都仍是一樣的。如果只是這樣倒沒什麼差,但我卻發現某個很大咖的研究中心,在推廣教學時,反而去引用 B 先生的網誌文章,這就讓我感覺對 A 先生的不公平,畢竟原先的文章是由 A 先生辛苦撰寫的嘛。


anyway,稍稍抱怨一下,我猜我發現的那個網站應該是類似機器人處理的,因為它除了有制式的格式外,還有附上文章來源的網頁快照(snapshot),只是,尊重作者,最好還是明確地寫上些完整的訊息會來得更好。但,寫下東西的最大用意除了跟大家分享外,就是幫自己寫點紀錄啦。


Facebook API Publisher - 使用 Attach 附件服務增加發佈塗鴉牆的效果

Facebook Attach


有時希望可以讓使用者在分享文字或連結時,能自動帶出一些效果,這時候我們需要的就是 Publisher 服務。例如當輸入 YouTuBe 影片連結時,系統會自動幫我們嵌入 YouTuBe 的顯示頁面,而不再只是簡單的 link 樣貌,此時原理即是將使用者輸入的資料,進行分析再轉換成新的呈現方式。


然而,目前 Facebook 平台開放的狀態還沒讓開發者如此便利,但有個間接使用的方式,那就是發表時以 Attach(附件) 來呈現。關於 Attach 的設定方式如下:


Setup



  • My Applications > Edit Settings > Profiles > Profile Publisher

    • Publish

      • Text

      • Callback URL



    • Self-Publish

      • Text

      • Callback URL






其中可分成兩類,一種是在別人的塗鴉牆留言時,另一種則是在自己的塗鴉牆留話。分別都需要填寫兩項資訊,其中 Text 代表在 Attach(附件) 顯示的按鈕名稱,如:加增表情符號。 Callback URL 則是當使用者按下按鈕時,系統會去這個位置要資料來呈現。實作上要留意,那個 Callback URL 回傳的資料要以 JSON 格式回來。


至於 Facebook 去 Callback URL 進行撈資料時,帶有以下參數資訊:



  • fb_sig_api_key: Your application's API key.

  • fb_sig: A signature using your application's secret key to encrypt the request.

  • fb_sig_in_canvas: This parameter is always false or 0 because the Publisher is not a canvas page.

  • fb_sig_request_method: This is always a POST method.

  • fb_sig_locale: This is the user's locale.

  • fb_sig_time: The time that the request was made.

  • fb_sig_added: Indicates whether the user has authorized (agreed to your Terms of Service) the application.

  • fb_sig_profile_user: Indicates the user whose profile is being published to.

  • fb_sig_user: The ID of the user interacting with the Publisher.

  • method: Indicates if the Publisher is getting the application's Publisher interface or getting the Feed story. 

  • 等等‥


只是,依舊沒有使用者當下輸入的資訊,這讓我有一點小失望,這也可能基於一些隱私或安全性的考量吧?剩下的我只好有空再來摸索啦!但是,目前開放的平台特色仍可以做出不錯的效果喔!


發佈塗鴉牆的效果
Facebook Attach

點選播放的畫面
Facebook Attach


簡單的 Callback 程式碼,其中 base.php 則是處理 Facebook API 的初始化,而 publisher_getFeedStory 部份則是直接用上頭 Facebook - Publisher 提到的範例。


<?php
require( 'base.php' );
$data = array();
$data['content'] = array();

$out = '';
foreach( $_REQUEST as $k => $v )
        $out .= "[$k] => [$v]<br>";
if( !isset( $_REQUEST['method'] ) || $_REQUEST['method'] == 'publisher_getInterface'  )
{
        $data['content']['fbml'] = json_encode( $out );
        $data['content']['oublishEnabled'] = true;
        $data['method'] = 'publisher_getInterface';
}
else
{
        $data['content']['attachment'] = array();
        $data['content']['attachment']['name'] = 'ninja cat';
        $data['content']['attachment']['href'] = 'http://www.youtube.com/watch?v=muLIPWjks_M';
        $data['content']['attachment']['caption'] = '{*actor*} uploaded a video to www.youtube.com';
        $data['content']['attachment']['description'] = 'a sneaky cat';
        $data['content']['attachment']['properties'] = array();
        $data['content']['attachment']['properties']['category'] = array();
        $data['content']['attachment']['properties']['category']['text'] = 'pets';
        $data['content']['attachment']['properties']['category']['href'] = 'http://www.youtube.com/browse?s=mp&t=t&c=15';
        $data['content']['attachment']['properties']['ratings'] = '5 stars';
        $data['content']['attachment']['media'] = array();
        $data['content']['attachment']['media'][0]['type'] = 'video';
        $data['content']['attachment']['media'][0]['video_src'] = 'http://www.youtube.com/v/fzzjgBAaWZw&hl=en&fs=1';
        $data['content']['attachment']['media'][0]['preview_img'] = 'http://i2.ytimg.com/i/uZp-cf0yOTqQEOuKGGnocg/1.jpg';
        $data['content']['attachment']['media'][0]['video_link'] = 'http://www.youtube.com/watch?v=muLIPWjks_M';
        $data['content']['attachment']['media'][0]['video_title'] = 'ninja cat';
        $data['method'] = 'publisher_getFeedStory';
}
echo json_encode( $data );
?>


其中,上述發佈用的 template 允許四種 type ,分別為 image , flash, mp3, vedio ,細節請參考 Facebook - Attachment (Streams)


參考資料



2009年11月3日 星期二

[Javascript] 以 Array 方式產生亂數序列

有時需要一串亂數序列使用時,例如亂數播放影片等等的,就可以用下面這招!把數列都打亂囉。


使用到 Math.round (四捨五入) 與 Math.random (亂數),流程是先呼叫 Math.random 產生一個介於 0 ~ 1 的數字,再利用 Math.round 讓這個數值為 0 或 1 ,最後再把數值扣 0.5 ,讓它明確地變成負數或正數,以此達成 sorting 用的 compare function 啦。因此呼叫 sort 完後,就變成亂數的序列囉。


<script type="text/javascript">
    test = new Array( 1 , 2 , 3 , 4 , 5 );
    test.sort( function(){ return Math.round( Math.random() ) - 0.5 ; } );
    document.write( test );
</script>

參考資料