March 24,2009
防止QuickTime因為程式crash而沒有正確釋放資源
寫QuickTime相關程式的時候,有時會因為要debug而常常不正常結束QuickTime相關的程式,但是因為沒有正確的釋放QuickTime的資源,有可能造成QuickTime再也開不起來(會卡死在InitializeQTML()裡)。
預防的方法是……
先開一個什麼事都不做的QuickTime Player在旁邊放著
原理不明,但猜測由於系統中還有至少一個QuickTime相關的程式開著,所以在正常或是不正常結束的時候不會真的去釋放QuickTime的resource,而不會造成一些resource被錯誤的釋放最後造成QuickTime無法開啟的情形。
February 16,2009
CFStringRef的刪除
之前開檔時用到的CFStringRef一直以來都以為只是個structure而以
所以一直也沒管它的release,後來才驚覺這是個 pointer,於是開始找相關的free function
指令非常的簡單
CFRelease(<Any CF Object>);
不只 CFStringRef,其它的CF(Core Fundation)物件也通用
February 11,2009
Windows 上的 Quicktime Codec 開發筆記
Apple不愧是Apple....果然工程師的思考邏輯都異於常人
不過這應該歸功於MacOSX上面大多是使用C和Objective C的關係
很多C++上靠class完成的功能,Apple的工程師都是靠structure和marco
Quicktime的codec說穿了只是一個普通到不行的 DLL 檔案
但是加上了Apple專用的resource資源來描述這是個什麼樣的codec
另外codec的進入點(entry point)也是要靠這個resource來描述
首先用Visual Studio很簡單地產生一個標準的DLL專案
生出來之後也不用動它的source code了,反正完全不會用到.....
接下來必需編輯一個 .r 的檔案(r代表resource)
裡面最少要有兩個resource
其中一個type是 'cdci',用來記錄codec info
另一個type必需是'thng',裡面記錄了codec對應的4cc和entry point
編輯完 .r 檔後,必需使用 Rez.exe 來編譯(這程式在Quicktime SDK裡面)
簡單 call 法如下
Rez.exe -p -i [include dir] -o [*.qtr, as output] < [*.r, as input]
在沒有任何錯誤的情形下,應該會生出一個 .qtr 的檔案
接下來必需使用 RezWack.exe 這隻程式來將 .qtr 檔合併至我們產生的 DLL 裡
簡單 call 法如下
RezWack.exe -f -d [*.dll, dll filename] -r [*.qtr, qtr filename] -o [*.qtx, qtx filename]
這樣會產生最終的 qtx 檔案,把這個檔案安裝至 system32 或是 Quicktime 的 Component 目錄下面就可以開始測試了
January 22,2009
How to get Quicktime track media type
OSType media_type;
GetMediaHandlerDescription(m, &media_type, NULL, NULL);
returned media_type could be:
VideoMediaType = FOUR_CHAR_CODE('vide'),
SoundMediaType = FOUR_CHAR_CODE('soun'),
TextMediaType = FOUR_CHAR_CODE('text'),
BaseMediaType = FOUR_CHAR_CODE('gnrc'),
MPEGMediaType = FOUR_CHAR_CODE('MPEG'),
MusicMediaType = FOUR_CHAR_CODE('musi'),
TimeCodeMediaType = FOUR_CHAR_CODE('tmcd'),
SpriteMediaType = FOUR_CHAR_CODE('sprt'),
FlashMediaType = FOUR_CHAR_CODE('flsh'),
MovieMediaType = FOUR_CHAR_CODE('moov'),
TweenMediaType = FOUR_CHAR_CODE('twen'),
ThreeDeeMediaType = FOUR_CHAR_CODE('qd3d'),
SkinMediaType = FOUR_CHAR_CODE('skin'),
HandleDataHandlerSubType = FOUR_CHAR_CODE('hndl'),
PointerDataHandlerSubType = FOUR_CHAR_CODE('ptr '),
NullDataHandlerSubType = FOUR_CHAR_CODE('null'),
ResourceDataHandlerSubType = FOUR_CHAR_CODE('rsrc'),
URLDataHandlerSubType = FOUR_CHAR_CODE('url '),
AliasDataHandlerSubType = FOUR_CHAR_CODE('alis'),
WiredActionHandlerType = FOUR_CHAR_CODE('wire'),
kQTQuartzComposerMediaType = FOUR_CHAR_CODE('qtz '),
TimeCode64MediaType = FOUR_CHAR_CODE('tc64')
September 23,2008
Create long filename Quicktime movie file under Windows
舊的(3.X)Quicktime SDK裡的CreateMovieFile受限於因為要吃 FSSpec 的關係,在 Windows 下最長的檔名只有 64 byte,在一些情形下很容易就爆檔
在QT6.5以及7.0後對於這種情形增加了一些API來替換原來的檔案操作API,在這篇文章裡有詳細的對照
Modernizing QuickTime Applications
所以我們必需將 CreateMovieFile 換成 CreateMovieStorage 來達成這個目的,但第一個問題是原來的 FSSpec 被替換成
EX: QTNewDataReferenceFromFullPathCFString 可以由 Windows 的路徑來獲取 data reference 物件
但問題又來了,裡頭的 CFStringRef 是屬於 Core Fundation 下面的基本 string 物件,我們得自己把它 new 出來
ASCII版,From CString
CFStringRef file_string = CFStringCreateWithCString(NULL, filename, ::kCFStringEncodingASCII);
Unicdoe string 用這個
CFStringCreateWithCharacters(NULL, (UniChar*) filename, lstrlenW(filename));
有這這個 file_string 就可以一路串回去了
在QT6.5以及7.0後對於這種情形增加了一些API來替換原來的檔案操作API,在這篇文章裡有詳細的對照
Modernizing QuickTime Applications
所以我們必需將 CreateMovieFile 換成 CreateMovieStorage 來達成這個目的,但第一個問題是原來的 FSSpec 被替換成
Handle dataRef這兩個參數,但在7.0以後Apple提供了一些比較方便的function來獲得這兩個參數
OSType dataRefType
EX: QTNewDataReferenceFromFullPathCFString 可以由 Windows 的路徑來獲取 data reference 物件
但問題又來了,裡頭的 CFStringRef 是屬於 Core Fundation 下面的基本 string 物件,我們得自己把它 new 出來
ASCII版,From CString
CFStringRef file_string = CFStringCreateWithCString(NULL, filename, ::kCFStringEncodingASCII);
Unicdoe string 用這個
CFStringCreateWithCharacters(NULL, (UniChar*) filename, lstrlenW(filename));
有這這個 file_string 就可以一路串回去了
- PS.1 Core Fundation 的header檔沒宣告 calling conversion,但實際上是 cdcel,link不過時可以試試改 calling conversion。
- PS.2 CreateMovieStorage 預設會建立一個同名的 .#ref 檔案,在呼叫時的flag上加上createMovieFileDontCreateResFile可以避免建立這個檔案
September 9,2005
Quicktime for Win SDK 7.0 will out soon?
August 25,2005
DV 4CC
| DV | DV25 | DV50 | |
| Color sub sample | 4:1:1 | 4:1:1 | 4:2:2 |
| 4CC | dvsd | dv25 | dv50 |
| DirectShow media subtype | MEDIASUBTYPE_dvsd | MEDIASUBTYPE_dv25 | MEDIASUBTYPE_dv50 |
| Quicktim codec code | kDVCNTSCCodecType 'dvc ' |
kDVCNTSCCodecType 'dvc ' 'dvcp' not used! |
'dv5n' |
August 9,2005
AAC Enocder? Pay first XD
由於 Video 的部分做的差不多了,開始和 leader 討論 Audio Codec 要用啥
本來想說 Quicktime 本身就可以壓 AAC 了,應該是個不錯的選擇
不過自己寫出來的 code 居然沒有 AAC 的選項?
於是……再度拜請咕狗大神……回答如下:
http://developer.apple.com/qa/qa2001/qa1347.html
意思就是,想要 Windows下要能用在Quicktime mov 上的 AAC Encoder?
錢交出來先 XD
這下剛好先QK一下……等看看上面要不要賞點錢買授權囉:P
本來想說 Quicktime 本身就可以壓 AAC 了,應該是個不錯的選擇
不過自己寫出來的 code 居然沒有 AAC 的選項?
於是……再度拜請咕狗大神……回答如下:
http://developer.apple.com/qa/qa2001/qa1347.html
意思就是,想要 Windows下要能用在Quicktime mov 上的 AAC Encoder?
錢交出來先 XD
這下剛好先QK一下……等看看上面要不要賞點錢買授權囉:P
August 4,2005
TimeValue 別用太大的數字
會爆= =|||
DirectShow 使用的 TimeValue 精度是十億份之一秒(ns)
本來想寫Quicktime的時候也採用這個數字以便達成其間的無失真轉接
不過沒想到Quicktime的TimeValue type 位元數太少,設到這麼大會讓影片檔整個「爆檔」
只要影片長度超過三分鐘……那個檔案就準備葛屁了ORZ
目前用的精度是千分之一秒(ms) 感覺精度差好多啊 ORZ
DirectShow 使用的 TimeValue 精度是十億份之一秒(ns)
本來想寫Quicktime的時候也採用這個數字以便達成其間的無失真轉接
不過沒想到Quicktime的TimeValue type 位元數太少,設到這麼大會讓影片檔整個「爆檔」
只要影片長度超過三分鐘……那個檔案就準備葛屁了ORZ
目前用的精度是千分之一秒(ms) 感覺精度差好多啊 ORZ
July 28,2005
Prepare a handle for AddMediaSample
// prepare your handle
Handle bufHandle = NewHandleClear(0);
Ptr bufPtr = NewPtrClear(SIZE_YOU_WANT);
:
:
do some stuff to bufPtr
:
:
// put your ptr & handle together
PtrAndHand(bufPtr, bufHandle, outBytes);
:
// use your bufPtr here
AddMediaSample(.........);
:
// DO NOT forget to dispose your buffer ptr and handle
if(bufPtr)
DisposePtr(bufPtr);
if(bufHandle)
DisposeHandle((Handle)bufHandle);