Quicktime分類文章 顯示方式:簡文 | 列表

March 24,2009

防止QuickTime因為程式crash而沒有正確釋放資源

寫QuickTime相關程式的時候,有時會因為要debug而常常不正常結束QuickTime相關的程式,但是因為沒有正確的釋放QuickTime的資源,有可能造成QuickTime再也開不起來(會卡死在InitializeQTML()裡)。

預防的方法是……

先開一個什麼事都不做的QuickTime Player在旁邊放著

原理不明,但猜測由於系統中還有至少一個QuickTime相關的程式開著,所以在正常或是不正常結束的時候不會真的去釋放QuickTime的resource,而不會造成一些resource被錯誤的釋放最後造成QuickTime無法開啟的情形。

Posted by toki_kanno at 樂多Roodo!9:39回應(0)引用(0)

February 16,2009

CFStringRef的刪除

之前開檔時用到的CFStringRef一直以來都以為只是個structure而以
所以一直也沒管它的release,後來才驚覺這是個 pointer,於是開始找相關的free function

指令非常的簡單 

CFRelease(<Any CF Object>);

不只 CFStringRef,其它的CF(Core Fundation)物件也通用

Posted by toki_kanno at 樂多Roodo!17:44回應(0)引用(0)

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 目錄下面就可以開始測試了

Posted by toki_kanno at 樂多Roodo!10:59回應(0)引用(0)

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')

Posted by toki_kanno at 樂多Roodo!16:29回應(0)引用(0)

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 被替換成
Handle dataRef
OSType dataRefType
這兩個參數,但在7.0以後Apple提供了一些比較方便的function來獲得這兩個參數

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可以避免建立這個檔案

Posted by toki_kanno at 樂多Roodo!10:19回應(0)引用(0)

September 9,2005

Quicktime for Win SDK 7.0 will out soon?

在 Quicktim-API 的 mailing list 上看到的:

官方的 developer site 上的文件已經出來了


另外: 7.0 QTMLClient dump 的結果,可以看到一堆 CF 開頭的字串
應該是 MAC 上的 CoreFundation library 的 function

不過我還是希望能出個簡便點的 Quicktim Class 會讓人高興點 ...繼續閱讀

Posted by toki_kanno at 樂多Roodo!10:47回應(0)引用(0)

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'

Posted by toki_kanno at 樂多Roodo!11:29回應(3)引用(0)

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

Posted by toki_kanno at 樂多Roodo!17:04回應(0)引用(0)

August 4,2005

TimeValue 別用太大的數字

會爆= =|||

DirectShow 使用的 TimeValue 精度是十億份之一秒(ns)
本來想寫Quicktime的時候也採用這個數字以便達成其間的無失真轉接
不過沒想到Quicktime的TimeValue type 位元數太少,設到這麼大會讓影片檔整個「爆檔」
只要影片長度超過三分鐘……那個檔案就準備葛屁了ORZ

目前用的精度是千分之一秒(ms) 感覺精度差好多啊 ORZ

Posted by toki_kanno at 樂多Roodo!15:06回應(0)引用(0)

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);


Posted by toki_kanno at 樂多Roodo!16:39回應(0)引用(0)
 [1]  [2]  [最終頁]