一,使用 Windows XP 內建的燒錄功能
參考
http://msdn.microsoft.com/msdnmag/issues/04/04/CQA/
1,簡單檔案燒錄
使用 Shell 的 ICDBurn 介面,其中方法:
HasRecordableDrive 掃描系統,如果發現可寫的CD磁碟機則返回TRUE。
GetRecorderDriveLetter 返回可寫磁碟機。
Burn 執行燒錄動作,從集結區(staging area)寫入 CD-R。
其中,在執行燒錄之前必須先把要燒錄的檔案複製到集結區,集結區是一個臨時目錄,位於使用者目錄 "%USERPROFILE%\Local Settings\Application Data\Microsoft\CD Burning" ,也可以通過下面的Shell API擷取:
SHGetFolderPath(CSIDL_CDBURN_AREA)
注意這裡的方法只能用於單個燒錄光碟機,如果你有多個燒錄光碟機就不行了。
2,音樂CD、CD-RW 等更複雜的燒錄
這裡使用的是 IMAPI (映像控制 Image Mastering API),也是 Windows XP 以上版本支援。IMAPI 可用於查詢燒錄機、寫入資料以及一些叫不出名字的先進功能。
建立 MSDiscMasterObj 對象,該對象有如下介面:
-o IDiscMaster
-o IRedbookDiscMaster
-o IJolietDiscMaster
稍為解釋一下:CD 一般分為兩種:音頻CD和資料CD,前者遵循紅皮書規範,後者則為ISO-9660規範 (也有其它一些資料規範,Joliet是ISO-9660的擴充。)
首先獲得 IDiscMaster 介面,調用 EnumDiscMasterFormats 列舉磁碟機支援的媒體格式 (Redbook, Joliet等),根據格式擷取 IRedbookDiscMaster 等對應介面。如果要求更高可以調用 Get/SetActiveDiscMasterFormat 以動態更新。
然後調用 EnumDiscRecorders 列出所有燒錄裝置,對應 IDiscRecorder 介面,該介面提供諸如裝置路徑、屬性、彈出、擦除 CD-RW 等功能,但不包括寫入資料。
具體的寫入資料根據不同格式而不同,對於資料CD,即Joliet 格式,首先調用 AddData(IStorage*) 方法加入檔案、目錄等,而對於音頻CD,即紅皮書格式則首先調用 AddAudioTrackBlocks 加入音軌。這些方法都是將資料拷貝到集結區,而不是立即寫入。
當資料都準備好了,最後調用 IDiscMaster 的 RecordDisc 方法就可以了。這個方法有一個 bSimulate 的參數用於“類比寫入”,不過你可能永遠不會去用它。
關於 IMAPI 就介紹到這,它雖然比較簡單,不過靠著 Windows XP 這棵大樹,對於VB程式員也差不多足夠了。
二,MCDB - Magic CD/DVD Burner (C/C++ Library)
MCDB 是 Binary Magic 開發的商用 CD/DVD 燒錄組件,易用性比較好,有 VCL 和 ActiveX 兩大類別,Audio/CD/DVD/VCD 等不同媒介的幾個版本,可用於 Delphi, C++ Builder, C#, VB.net, VB, C++ 等開發語言。MCDB支援UDF介面,Unicode字元集,以及多種燒錄機介面,可非常容易的製作MPEG VCD、可啟動光碟片等,其核心使用ASPI介面(進階SCSI編程介面,也可用於訪問IDE介面)。
編寫 MCDB 應用程式非常簡單,基本類似於 IMAPI。
首先建立 MCDBurner 對象,屬性 DeviceCount 和 DeviceName[] 查得燒錄機列表。
通過調用 InsertFile/InsertDir 將如要寫入的檔案和目錄,然後執行寫入,有幾種不同的寫入方法:
BuildISOImage(filename) 寫入ISO映像檔案
BurnISO(isofile) 將 ISO映像檔案寫入光碟片
Prepare/Burn 直接寫入光碟片 (也就是著名的 on-the-fly 寫盤技術)
其它常用的方法有:
EraseDisc 擦除 CD-RW 碟片
DiscIs 判斷媒體類型
MaxWriteSpeed/WriteSpeed 寫入速度
LoadMedium/EjectMedium 裝入和彈出光碟片
MCDB 的 120M 試用版可在 www.binarymagics.com 上下載,零售價為200-400美元不等,同時有源碼出售,價格2000美元左右。
三,hpCDE
hpCDE 是 Primo Software 開發的一款高效能CD/DVD燒錄組件,目前版本1.78,從特性列表中可以看到它對硬體的支援非常多,在寫入中支援 DVD DAO/Incremental、TAO, SAO, DAO, RAW, CD-PLUS 等多種模式,支援 UDF和HFS檔案系統,可用於燒錄供Mac OS使用的光碟片,以及支援飛盤保護如JustLink, SafeBurn, SmartBurn等進階特性。
相較於前面兩個,hpCDE明顯複雜,沒辦法~ 強大的東西總是複雜的。
先從CD複製開始,工廠類 hpCDE 提供了其它類的構建方法,大致過程如下:
初始化:
hpCDE::CreateEngine 獲得引擎對象
IEngine::Initialize 初始化引擎,其中win 95/98必須使用ASPI,而NT則不用。
IEngine::GetDevices 獲得磁碟機列表
- IDeviceCollection::GetItem 枚舉磁碟機
- IDevice::GetWritePossible 判斷是否可寫,並忽略不可寫裝置
- IDevice::GetDriveLetter 查詢盤符
- IDevice::GetDescription 查詢卷標
- IDevice::GetMediaFreeSpace 判斷是否碟片是否可用
- IDevice::GetMediaIsBlank 判斷是否為空白盤
- IDevice::GetMaxWriteSpeed 最高寫入速度
- IDevice::GetReWritePossible 燒錄機是否支援擦除
- IDevice::GetMediaIsReWritable 碟片是否可擦除
如果希望CD複製並行進行,因此需要建立兩個線程分別用於讀取/寫入,hpCDE 支援多執行緒模式。hpCDE 支援SAO/TAO/DAO,這裡CD複製使用的是 DAO。對於多段寫入,每個段對應於一個ISession,一個Session可以包含多個Track。
寫入過程:
IDevice::SetCurrentSpeeds 設定寫入速度
IDevice::Eject 彈出碟片
參考
http://www.hpcde.com/documentation/index.html
四,cdrdao, cdrtools
參考:
http://cdrdao.sourceforge.net/
http://freshmeat.net/projects/cdrecord/
http://linuxcommand.org/man_pages/cdrecord1.html
cdrdao 是一款開源 DAO 模式燒錄軟體,有 linux 和 windows 兩個版本。
cdrdao 僅支援一種模式 DAO 即一次完成寫盤,這種模式可以實現一些 pre-gaps 的有趣特性,對於光碟片防拷貝,則可以實現 ECC 檢查的技巧。因為是專門為 DAO 設計,不是專業人士恐怕無法閱讀其原始碼。
cdrtools 也是開源的,不過它是全功能的,包括IDE/ATAPI/SCSI, 音頻/資料/混合CD,多段燒錄,CD-RW,TAO/DAO/RAW 等等,同時支援很多作業系統。