AVCHD / M2TS 小註解

Panasonic 和 Sony 在 2006/5/11 推出 AVCHD 格式, 並且允許燒錄 AV 檔案到 8cm DVD 上. 兩個月後, SD 記憶卡、Memory Stick、HDD 也都支援 AVCHD. 

AVCHD 乍看不知道是甚麼東西的縮寫, 其實它至少是兩個字 AVC 和 HD. AVC = audio video coding, HD = high definition. 在這個格式下, video 是 H.264, audio 是 5.1 CH AC3 或 7.1 CH 的 LPCM, 並且封裝在  MPEG2 TS bit stream 裡面.

現在當紅的 “小藍光" (mini BD, 大藍光 BD 的向下相容盜版) 就是採用 AVC-HD 的格式. Audio 的格式也變得多采多姿, DTS, TrueHD…都有了. 由於 PS3 恰好可以播小藍光, 所以在這個商機裡面獲利不少~~~ http://en.wikipedia.org/wiki/.m2ts#Software


AVCHD 的格式如下圖 (取自 WIKI)

AVCHD 的特性除了 audio, video 之外, 包括 menu navigation, slide shows 和subtitles. Menu navigation 是指 DVD 常見的 – 從 menu 畫面點選播放 title. 

AVCHD 和 BDMV 不同, BDMV 可能放在 AVCHD 底下, 或者和 AVCHD 同層. 

IEC 61937 Overview

SPDIF 界面的規格, 可以看 IEC 60958-3 的描述. 它是由 Sony 和 Philips 所共同制定的規格, 又稱作 S/PDIF. 主要是用來傳送壓縮後的音訊資料或是解壓縮後的立體聲資料.

如果 SPDIF 上面承載的是壓縮後的音訊資料, 那麼就要參考 IEC 61937. SPDIF 也傳不動的東西, 就要靠新的規格 HDMI 了. HDMI 可以傳送 4 倍 SPDIF 的速度, 相當於每個 sample 16 bits. 以 24 bits 的 LPCM 來說, 16 bits 相當於壓縮 66.7%. TrueHD 和 DTS-HD MA 差不多就是這種壓縮率.

61937 內容
part-1 general
part-2 burst info
part-3 AC-3
part-4 MPEG
part-5 DTS
part-6 AAC
part-7 ATRAC 1/2/3
part-8 WMA
part-9 Dolby MAT (Metadata-enhanced Audio Transimission)
part-10 MPEG4 – ALS
part-11 MPEG4 AAC in LATM/LOAS (streaming)
part-12 DRA

SPDIF 的介紹可以看這個網站: http://www.hardwarebook.info/S/PDIF

RealAudio 格式整理

RealMedia 雖然算是我們的合作夥伴, 但是我還是要吐槽他們格式紊亂! 我知道 Wiki 上有做整理, 不過有時忽然又會忘記下哪一個 keyword 才找得到, 乾脆整理在自己的網站上吧!

 

Format 格式名稱 技術 特性 對應 player
RA1     一說就是 RA2-LBR  
RA2-LBR lpcJ IS54,VSELP 過時, 14.4 kbps  
RA2-HBR 28.8 G.728,LD-CELP 過時, 28.8 Kbps  
RA3 dnet Dolby AC3-like 過時  
RA4        
RA5 sipr Sipro ACELP 過時 Real Voice
RA6 cook Cook 1-2 CH RealPlayer G2
RA7        
RA8-LBR cook Cook,Gecko2 12~64 Kbps RealPlayer G2
RA8-HBR atrc Sony ATRAC3 >64 kbps,過時  
RA9 raac MPEG LC-AAC    
RA10-LBR cook Cook,Gecko2 5.1 CH, 12~128Kbps RealOne Player
RA10-HBR racp MPEG HE-AAC 128~800 Kbps RealOne Player
RA10 ralf RA lossless   RealOne Player

 

[note] RealOne player is backward compatible to RealPlayer G2.

使用 Awk 的小筆記

因為需要把 link 出來的執行檔切到 .bss section 為止, 以便做成比較小的載入檔, 所以我們一直需要一個把大檔案切小的功能. 反正 .bss 是不需要初值的, 根本不用儲存那一塊.

原先我們的公用 makefile 是比較陽春的, 為了吃進參數方便, 在 makefile 中 run-time 去編譯一個 c++ 的小程式, 以便在 Linux 和 Cygwin 的環境都可以用.

不過最近遇到問題了, 假如某台 Linux server 不適合灌 development tool chain, 那根本就不能 make 了. 為了解決這個問題, 我決定用 gawk 來做它.

Gawk 來自 AT&T 的 awk, 加了 G 字頭之後, 就表示它是 Gnu 家族的 freeware 成員. 另外還有個 Nawk, N 字頭表示 New (新版).

Gawk  沒有型別定義, 變數可能是 string, 也可能是 number,  完全看場合而定. 它可以寫成一行文 gawk {}, 或是讀一個批次檔來執行 gawk -f batchfile.

因為一行文已不符合我的需求, 所以我這次是用檔案.

x = $1

就把參數 1 抓進來了. $2 表示參數 2, 依此類推. 但是 $0 表示一整行的所有參數.

那第二行怎麼辦呢?

用 getline, getline 之後, 原來的 $0, $1,…就都變成與下一行的對照關係了.

依據這樣的參數, 就可以計算出真正需要的 file size 有多大.

不過另外有一個問題. Gawk 有三角函數的計算能力, 我卻找不到計算 16 進位的加減法功能? 這時當然是上網找打手. 在 http://os.cqu.edu.au/cgi-bin/info/info2html.cgi?(gawk)Strtonum%20Function 有現成的 sting 到 number 轉換程式.

Gawk 是可以呼叫 function 的:

x = abs($1)

function abs(str)

{

}

因為 awk 沒有型別,  所以 function 的參數就直接是 variable. 我引用的這個網址使用了很漂亮的 index 技巧, 有興趣的人可以參考這個寫法.

if ((k = index(“abcdef", c)) > 0)

 k += 9

如此就把輸入 c = a, k = 9+ 1 (1 是 index = 1) 的計算給求出來了.

Gawk 還可以呼叫 system() 函數, 有這個功能就可以在 Gawk 裡面做很多事情. 總之, 這樣就可以把我要的 file size 計算出來了.

那麼怎麼砍檔案呢? 網路上有各式各樣的講法. 有人說可以寫一個 truncate function、有人說可以用 (c)split、有人說可以用 cut.  

split 會產生一大堆相同 size 的檔案, 而且也只適合於 text (line-based) 的文檔.

Binary 檔的切割, 用 cut 也不正確. 如果用 cut –help 去看, 就知道 cut -b 並不是要 cut 幾個 byte 出來, 而是每行 cut 這麼多 bytes!

所以用 head 或是 tail 才對, 他們才是適合切割 binary 檔的.

head -c 1000 BigFile > SmallFile

這樣就行了, 那個 1000 就用 gawk 來幫忙算. 如此即可以免去即時編譯 c++ 的困擾.

gawk 的使用手冊可以參考這個網址, 我都是用到多少才去了解多少, 沒手冊還真是不行.

http://www.grymoire.com/Unix/Awk.html

Shell Script in Makefile

不知道大家有沒有試圖在 Makefile 裡面寫個 shell script 呢?

打個比方來說, 如果這是一個 script

read -p “key in your name: " yourname

echo -e “Your Name is: " $yourname

隨便貼到一個 shell.sh, 然後執行, 保證很順利.

不過呢, 把這兩行貼到 makefile 之後就變樣了.

首先, 第二行不認識第一行的 yourname 了….

Why? 要 export 嗎?

不是!

因為 makefile 裡面的指令, 每一行是單獨在一個 sh 裡面執行的, 所以第二行當然不認識第一行的 yourname 囉!

解決之道是, 加上一個 ‘\’, 表示這兩行希望用同一個 shell.

read -p “key in your name: " yourname    \

echo -e “Your Name is: " $yourname

 

然而, 肯定還是失敗啦! 因為, 因為第一行裡面的 yourname 是經過求值的, 所以第二行要用 $$yourname 來取值. 這樣就會對了!

read -p “key in your name: " yourname    \

echo -e “Your Name is: " $$yourname

對了, 還要分號. 因為分號可以讓這行指令告一段落.

 

read -p “key in your name: " yourname ;   \ 

echo -e “Your Name is: " $$yourname;

如果有 do 迴圈, 分號的位置如下:

for d in logic ui; \

do \

  echo $$d/*.java; \

done > $@

這個簡單的撇步不懂的話, makefile 就會寫不好. 詳情請參閱 O’Relly 出版社的 “GNU Make 專案開發工具" 第三版的 page 100, “接續太長的命令".

說真的, 真本書超讚. 不過我沒有心情去一頁一頁地看它, 所以暫時不會有它的讀書心得跟大家報告. 或許想到哪裡, 寫到哪裡吧.