2010年10月24日 星期日

卡拉 ok 左右聲道合併方法

( 15-Jun-2010, Tuesday, 3:26:53 )
用 folder 內名為 winmenc 的 freeware , http://winmenc.blogspot.com/#, 在 windows 7 內將志菊 hard disk 內的 "鄭秀文 2007 演唱會卡拉 ok 版" 雙聲道合併為單聲道, 以解決這影片被放入志菊的 hyundai 手提 player 內播放時沒有了人聲這問題..

詳情如下:
話說志菊要將 divx 格式編碼的 sammi 2007 演唱會卡拉 ok 版本 avi 影片檔案放落新買回來的 hyundai 手提 player 內播放, 但發覺沒有了人聲, 只有音樂聲, 手提 player 亦沒有選取左右聲道的功能, 於是便求救於我......

....查看後發現這影片左右聲道似乎和一般的 mtv 不同, 用 kmplayer 播放並進入 audio/steam selection 視窗內選取聲道時, 無論選取 left/right/both 都仍然沒有人聲, 必須選取 audio stream 1 或 2 才有效, 而一般的 ktv, 例如容祖兒的 "抱抱", 則只選取前者便可 (並沒有顯示 audio stream 這選項), 原因待查....

...最初下載了 corel video studio pro 試用版及破解(估計以前叫做 ulead media studeo, 後來被 corel 收購了, 待証實), size 約六百多M, 但安裝時要進行一大輪解壓令程式加大到2G幾, 十幾二十分鐘後才安裝完成, 之後便將影片 load 入, 諗住將其中沒有人聲的 audio track 刪除然後再用另一條 track 代替, 但左攪右攪一大輪都係沒有人聲, 估計原因是這卡拉 ok 影片左右聲道是和一般的 ktv 不同所致....

....於是便用 "卡拉 ok 雙聲道" 在 google search 一下, 發現在 hkepc 論壇有人提出和自己同一情況的問題, http://www.hkepc.com/forum/viewthread.php?tid=1238404 , 並得知名為 winmenc 的 freeware , http://winmenc.blogspot.com/#, 便下載了最新版的 package 安裝方式(也可選用 manual 安裝方法, 視乎所需個別地下載程式), 無需安裝, 解壓後直接執行 winmenc.exe 便可, size 約 50M, 沒有影片預覽功能,  介面語言有簡繁英三種, 預設語言會視乎 non-unicode 設定而定, 可進入 about 內修改, 但唔知點解將語言改為英文後, 下次啟動時又會變番做 auto (繁體), 於是便進入 "lang" folder 內將簡繁語言的 ini 檔案刪除...
....初步得知這軟件是借助 mplayer 內的 codec 來進行轉換的, 所有 mplayer 能播放的影片都可以互相進行轉換云云, 而轉換核心則是名為甚麼 menc 的東東,  待再查...

....以下是以 "鄭秀文演唱會 2007 " 為例的轉換方法
(官網並沒有提供詳細使用說明, 是自己 "摸摸下" 地反復多次試驗後初步得出的方法):
(1) 進入 batch 分頁內按下 add files 來加入檔案, size 約 700M, 可以一次過加入多個檔案, 而 add a/v file 則用作將影片檔和聲音檔合併(是自己試驗後得知, 兩者要採用相同的檔名)

(2) 進入 video 分頁內選取 codec, 選 divx 便可(即是和原版相同), 估計不同的影片檔都可以採不同的 codec, 例如 avi, flv, mkv, mp4, mpg, wmv 等影片可選用 divx, xvid, x264, mpeg1, mpeg2, flv, wmv1, wmv2 等 codec , 這是自己由這軟件的欄位分佈來作出這估計的, i.e. video 分頁內的 codec 欄位以及 extra 分頁內的 output format 欄位, 待証實 , 另外也可到官網下載更多的 codec (已下載過並放在 "codecs" folder 內, 但唔知點用, 待再查)
...勾選 quality, video quality 則設為 4 (設為 3 的話會令檔案 size 加大到大約 900M, 設為 5 的話又會令影片起格, 設為 4 不會起格, size 亦會縮少到約 500M)..
...video size 設為 480 x 272 (即是和志菊的 player 解像度相同, 原版是 624 x336)..
...video frames 設為 original, 其它欄位亦沒有改動..

(3) 進入 audio 分頁將 audio stream 由 default 改為 2 (這影片就是由這欄位決定左右聲道, 設為 default 或 1 都沒有了人聲, 設為 2 才會令左右聲道都會發出人聲)
....audio channel filter 由 none 改為 right stereo (其實設為任何都沒有分別, 因為這影片的聲道是由 audio stream 欄位決定, 已試驗過若 audio stream 設為 default 或 1 時無論這欄位設為 left mono, left stereo, right mono, right stereo , mix mono 都沒有人聲, 但若是一般的 ktv 影片的話, 例如前述容祖兒的 "抱抱", 便會由這欄位決定聲道 )
....勾選 volume nomarlize (自己亦不知其作用, 只是貪得意才勾選它而已)
...其餘欄位都沒有改變, 包括 audio codec 會自動設為 mp3 (即是和原版相同), 待証實

(4) 進入 extra 分頁設定 output format, 會自動設為 avi (即是和原版相同)

(5) 設定 output folder, 然後按下 encode 便可, 大約十多分鐘後便轉換完成, 有需要的話亦可將以上所有設定儲存為一個 profile, 程式亦提供了十多二十個預設的 profile, 只需按下視窗底部的 profile 按鈕便可選用它們..

2010年8月10日 星期二

Anti-aliasing 方法 (supersampling ; area sampling ; weighted ; unweighted)

資料來源 : 名為 " Computer Graphics principles and practice 2nd edition in C " 一書, page 620, 可在 "3d 相關電子書" folder 內找到..

..就是改變 pixel 顏色顯示的計算方式, i.e. 增加 sample point 的數目, 然後平均地計算出該 pixel 的顏色值, 亦即是所謂的 supersampling , 例如在某 3d software 內輸出一幅 800 x 600 的圖, 還未啟動 supersampling 功能之前, 每一個 pixel 只會用一個 sample point 來計算該 pixel 的顏色值(通常是位於 pixel 的 center), 這種計算方式亦稱為 point sampling...
....當啟動 supersampling 之後, 該 software 會先將輸出圖片的解像度增大兩倍成為 1600 x 1200 (也可增大為 3倍, 4倍, 5倍...如此類推, 視乎不同的設定已定, 亦即是 modo 內名為 antialiasing 欄位內所設定的數值, 待証實), 然後將 4 個 pixel 的顏色結合為一個 pixel (利用 4 個 pixels 的顏色值平均地計算出該 pixel 的顏色), 如此類推地將解像度變番做 800 x 600 (這做法便等同將 pixel 界開為多個 sample points, 待証實),  將多個 pixels 合併為一個 pixel 的顏色計算方式亦稱為 area sampling, 當中又可分為 weighted 及 unweighted 兩種..., 
.....unweighted area sampling 是計算 sample points 顏色平均值時, 無論 sample points 是位於中間或邊位, 其計算強度完全相同, 計算方法就是將所有 samples 的顏色值相加再除以 sample 數目, 而 weighted area sampling 的 sample 顏色計算強度會視乎其位置而有所不同, 通常越接近 pixel 中心的 sample, 其強度便越大, 計算方法是先將每一個 sample 的顏色值乘以強度, 然後才加起來除以 sample 的數目....
.....3D software 會提供不同方式的 weighted/unweighted sampling 給你選擇, 亦即是所謂的 antialiasing filters, 例如 box filter 便屬於 weighted, 而 gaussian filter 則屬於 unweighted, 其中一個好處是令 animation 移動畫面不會出現 flickering 現象 (p.621)

進行 supersampling 時其 pixel 內的 sample 排列方式有多種, 包括 ordered grid(或 regular grid), rotate grid, random, poisson disc, jitterred 等等 (參看 http://en.wikipedia.org/wiki/Supersampling), 但估計除了 ordered grid 外, 其餘的方式都只會用在顯示卡上, 因為顯示卡要實時用 hardware 產生 antialiasing 效果, 由於 hardware 能力有限, 所以便不能使用太高的 samples 數目, 否則便會拖慢顯示速度, 正由於 samples 數目很小(例如 2 x 2 = 4 個 samples), 若採用一般的 ordered grid  方式的話, 由於其 samples 排列得太有規律而令效果強差人意, 於是便發明了其他的 samples 排列方式, 另外亦估計大多數的 3d software 都採用 ordered grid 排列方法, 因為其原理較簡單易用, 至於其排列太規律這問題, 只需將 samples 數目大幅提高便可解決

Aliasing 如何形成

資料來源 :  google search 所得來零零碎碎的資料綜合而成, 當中包括自己加入的一些想法, 未必百份百正確..

...由於 LCD 的 pixel 是四方形以及一行行咁排列的, 解像度有限, 雖然可以 "完美無瑕" 地顯示完全水平或垂直的線條, 但卻無法 "完美無瑕" 地顯示斜線或曲線而出現鋸齒現象(jagged edge), 另外若要顯示密集的黑白格仔或線條時, 亦會出現所謂的波紋現象(moire), 而對於動畫黎講, 亦會出現所謂的 flickering 現象 , 這些問題都稱為 Aliasing, 而解決這些問題的方法便稱為 Anti-aliasing...

.... 出現 jagged edge 的原因是由於 LCD 的 pixel 是四方形, 當顯示斜線時便只能用 "梯級線" 的方式來達成, 假設 LCD 的解像度是 100 x 100, 當顯示完全水平的直線時, 只需簡單地啟動打橫的 100 行 pixels 之中的其中一行便可(假設該直線的闊度是 1 pixel), 但若要顯示斜線的話(將完全水平的直線稍為轉動一兩度), 便要先啟動第一行的頭 10 個 pixels, 然後跳落下一行啟動 11 至 20 的 pixels, 再跳落下一行啟動 21 至 30 pixels , 如此類推...雖然 "梯級" 之間只有 1 pixel 的落差, 但由於 pixel 的 size 不夠微細, 令人類眼晴察覺到 "狗牙" 的存在 (若 pixel 是圓形的話可能會好 D, 但圓形之間會有空位, 除非可以做到互相重疊的圓形 pixel , 這時自己的諗法而已, 未必正確)....
.....另一個原因是由於線條上所有的 pixels 都用同一種顏色來顯示, 更加凸顯了 aliasing 的嚴重性, 假如 pixel 的顏色是跟據該線條所佔用的範圍平均計算出來的話 (即是 pixel 顏色有深淺變化), 便可將 "狗牙" 的嚴重程度減低, 雖然 pixel 的形狀及 size 並沒有改變, 但顏色的改變又會令人類眼晴察覺不到 "狗牙" 的存在(所以 anti-aliasing 方法亦是朝著這個方向進行)

LCD 如何顯示線條

  ....資料來源, 名為 computer graphics 的書, chapter 2, Scan Conversion Techniques, 作者是 A.P. Godse (在 google 圖書內 online 查看), 書內採用 linear equation 數學方程式原理配合類似 BASIC 的電腦語言來講解運算方法, 不算太艱深, 自己亦睇得明 (其實還提供了 C 語言, 但自己睇唔明), 以下是將書內容 "消化" 後得出的見解.....  

...對於繪畫直線條黎講, 點樣將 vector 線條顯示在一點點的 lcd 上呢? 可使用名為 Bresenham's Line Algorithm 的計算方法, 原理是取得頭尾兩個 pixels 的座標值之後(用 mouse 畫直線時所 click 選的兩個 points), 利用 "接近法" 遂一計算出第 2, 3, 4 ....的 pixels (頭 pixel 唔需要計算, 因為用 mouse 畫線時已被定出, 至於最尾的 pixel , 雖然亦已被定出, 但仍然會再用方程式計算一次 ), 所謂 "接近法",  是量度 pixel 中心點和 Vector 線之間的距離, 並選用距離較短的 pixel...
....例如頭尾兩個 pixels 分別為 (0,0) 及 (10,10), 這時第二個 pixel 便會是 (1,1), 因為 vector 直線會直接穿過這個 pixel 的中心點, 但若將尾 pixel 改為 (10,8) 的話, 這時 vector 直線便會位於 (1,1) 和 (1,0) 上下兩個 pixels 之間, 由於較接近上面的 pixel, 所以便選用了 (1,1), 其它行數計算方法相同....
.....咁駛唔駛計埋橫行呢? 答案是當 vector 直線斜度超過 45 度時便要改為採用橫行的 pixels, 否則便會出現錯誤, 例如頭尾兩個 pixel 是 (0,0) 及 (1,10) , 其直線斜度差不多有 90 度, 而且只有兩行打直, 若依然用打直的方法來計算的話, 每行取一個 pixel , 總數便只有兩個 pixels, 無法形成一條直線 (改用打橫 pixels 後, 第一直行會佔用 5 個 pixels, 第二直行亦佔用 5 個 pixels 而形成一條直線)....
...也可使用名為 DDA Algroithm 的計算方法, 但由於有弱點, 所以較小採用, 弱點包括 (1) 由於要用小數來運算, 計算速度較慢, 即是所謂的 floating point, 這是電腦的弱項(待查近年的 cpu 是否已不再存在這問題), 而前述計算方法則採用整數(integer)來運算, (2) end point 位置可能會出現偏差 , 即是經由方程式計算出來的 end point 並不能保証會等同 mouse-click 時的 point, 而前者的計算方法則完全準確...