腳本的DVD開(kāi)發(fā)
更新時(shí)間:2007年01月14日 00:00:00 作者:
好像包含表格不能發(fā)表,只有先拷貝到記事本里面才可以,所以格式都丟了,不好意思
這個(gè)也是很久以前的東西了,不準(zhǔn)確的地方還請(qǐng)大家見(jiàn)諒.哎,我的一本書(shū)沒(méi)有被出版,就放到這里吧(出版社的人說(shuō)看不懂,呵呵,我都快暈死了)
基于腳本的dvd應(yīng)用程序
在網(wǎng)絡(luò)發(fā)展神速的今天,軟件業(yè)越來(lái)越注重基于網(wǎng)絡(luò)的應(yīng)用,下來(lái)我們就探討一下基于web的程序編寫。這里主要講述使用mswebdvd控件進(jìn)行dvd應(yīng)用程序的開(kāi)發(fā)過(guò)程。
插入MSWebDVD對(duì)象
MSWebDVD對(duì)象可以處理所有的dvd導(dǎo)航命令,并可以在web頁(yè)面上顯示視頻。這將比原來(lái)的處理過(guò)程簡(jiǎn)單很多,簡(jiǎn)單的插入代碼示例如下:
<OBJECT CLASSID=clsid:38EE5CEE-4B62-11D3-854F-00A0C9C898E7 ID=DVD
STYLE="height:369px; width:740px">
<PARAM NAME="BackColor" VALUE="1048592">
<PARAM NAME="EnableResetOnStop" VALUE="-1">
<PARAM NAME="ColorKey" VALUE="1048592">
</OBJECT>
允許用戶處理dvd命令
若允許用戶控制dvd播放器,則需要提供一個(gè)用戶界面來(lái)引導(dǎo)用戶,比如“播放”,“停止”按鈕。下面的代碼就展示了怎樣將一個(gè)html的按鈕和mswebdvd對(duì)象關(guān)聯(lián)起來(lái)。
<INPUT ID=button1 NAME="button1" TYPE=button VALUE="Play" onClick=´Play();´>
<INPUT ID=button2 NAME="button2" TYPE=button VALUE="Pause" onClick=´Pause();´>
<SCRIPT LANGUAGE="JScript">
function Play(){
DVD.Play();
}
function Pause(){
DVD.Pause();
}
</SCRIPT>
用dvd菜單進(jìn)行工作
當(dāng)用戶點(diǎn)擊屏幕的按鈕時(shí),Mswebdvd會(huì)自動(dòng)的處理菜單命令。應(yīng)用程序不需要處理任何事情來(lái)實(shí)現(xiàn)對(duì)鼠標(biāo)的支持。但是應(yīng)用程序可以不考慮這個(gè)自動(dòng)處理過(guò)程。如果你對(duì)定制鼠標(biāo)工作十分感興趣,那么你可以使用mswebdvd關(guān)聯(lián)菜單的方法,比如SelectAndActivateButton, GetButtonAtPosition。要想徹底的禁止鼠標(biāo)的自動(dòng)化動(dòng)作處理,那么設(shè)置DisableAutoMouseProcessing屬性為真就可以了。
音頻和子圖流
一個(gè)dvd碟片可以處理8路音頻流,從0―7,每個(gè)音頻流又包含了6個(gè)獨(dú)立的通道。只有這些流在能在任何時(shí)間被激活。對(duì)于子圖來(lái)說(shuō),有32個(gè)流是有效的,從0-31。碟片通常制作成默認(rèn)的音頻和子圖流,但一個(gè)應(yīng)用程序允許用戶看到所有有效的流數(shù)據(jù),然后選擇一種他們喜歡的語(yǔ)言。基本步驟的處理和音頻與子圖流相同。
1. 決定指定標(biāo)題的有效流的數(shù)量。
2. 重新檢測(cè)每個(gè)流的屬性。
3. 從本地標(biāo)識(shí)中返回語(yǔ)言代碼,然后創(chuàng)建人們可讀的字符串。
4. 添加“選擇”對(duì)話框,或者別的用戶界面來(lái)允許用戶選擇首選的數(shù)據(jù)流。
(注意音頻和子圖流標(biāo)記是從0開(kāi)始的,然而別的大部分都是從1開(kāi)始)
強(qiáng)制父級(jí)管理層
在dvd碟片中通常任何的標(biāo)題或者標(biāo)題的一部分會(huì)被標(biāo)記一個(gè)父級(jí)管理層(PML)
從1到8,8級(jí)是限制最多的,1級(jí)是限制最少的等級(jí)。有一種想法提供了一種裝置來(lái)防止小孩看成人的內(nèi)容,但每個(gè)國(guó)家的特殊性決定了他們將不會(huì)一樣。在美國(guó)和加拿大是一種標(biāo)準(zhǔn),和別的國(guó)家就不太一樣。
MSWebDVD對(duì)象默認(rèn)狀態(tài)是忽略pmls的。對(duì)于應(yīng)用程序來(lái)講,它將會(huì)通報(bào)pml標(biāo)記,這樣必需調(diào)用NotifyParentalLevels(true)。當(dāng)在碟片上碰到pml信息的時(shí)候,MSWebDVD將會(huì)通知你的應(yīng)用程序。為了強(qiáng)制pmls,你的應(yīng)用程序必需實(shí)現(xiàn)一些邏輯口令來(lái)將用戶和不同的級(jí)別聯(lián)系在一起,響應(yīng)EC_DVD_PARENTAL_LEVEL_CHANGE事件來(lái)允許或者禁止訪問(wèn)。
保存和恢復(fù)書(shū)簽
書(shū)簽是一個(gè)MSWebDVD對(duì)象內(nèi)部的數(shù)據(jù)結(jié)構(gòu),它可以被用來(lái)創(chuàng)建一個(gè)當(dāng)前用戶任務(wù)的快照,包含內(nèi)容比如是當(dāng)前碟片位置的信息,私人的父層管理級(jí)別,選擇音頻和子圖流等等。這個(gè)意思是讓用戶可以保存當(dāng)前的dvd狀態(tài)可以下次接著從這個(gè)狀態(tài)中繼續(xù)觀看。
SaveBookmark方法允許用戶保存他們碟片的位置,RestoreBookmark方法則允許同一個(gè)用戶可以接著上次儲(chǔ)存的位置接著觀看。
一次只能儲(chǔ)存一個(gè)書(shū)簽。如果你調(diào)用了兩次SaveBookmark,那么第一次的書(shū)簽將會(huì)被第二次的書(shū)簽覆蓋。書(shū)簽對(duì)于計(jì)算機(jī)來(lái)說(shuō)是特別的。在不同的計(jì)算機(jī)中運(yùn)行同樣的html頁(yè)面,然后調(diào)用RestoreBookmark將會(huì)恢復(fù)最近的那次存儲(chǔ)的書(shū)簽,或者返回一個(gè)以前沒(méi)有存儲(chǔ)的標(biāo)志錯(cuò)誤。
處理dvd通報(bào)事件
當(dāng)某種事件發(fā)生了的時(shí)候,MSWebDVD對(duì)象會(huì)向應(yīng)用程序發(fā)送一個(gè)特定的通報(bào)事件,例如當(dāng)DVD的域改變了,當(dāng)遇到一個(gè)新的父層管理等等。事件參數(shù)可以獲得與事件有關(guān)的附加信息。錯(cuò)誤信息和警告信息都是通過(guò)這種方法進(jìn)行發(fā)送的。為了撲獲到變化的dvd事件通報(bào),在html SCRIPT中加入以下代碼。
<SCRIPT LANGUAGE="JScript" FOR=DVD EVENT="DVDNotify(EventCode, Param1, Param2)">
ProcessDVDEvent(EventCode, Param1, Param2)
</SCRIPT>
然后,在腳本中,定義事件代碼和ProcessDVDEvent函數(shù),下面的代碼將展示它的用法。(你可以給你的事件處理函數(shù)任何的名稱)
<SCRIPT LANGUAGE="JScript">
// DVD event codes are valued 257 through 283
var EC_DVDBASE = 256;
var EC_DVD_DOMAIN_CHANGE = (EC_DVDBASE + 1);
var EC_DVD_TITLE_CHANGE = (EC_DVDBASE + 2);
var EC_DVD_CHAPTER_START = (EC_DVDBASE + 3);
var EC_DVD_AUDIO_STREAM_CHANGE = (EC_DVDBASE + 4);
var EC_DVD_SUBPICTURE_STREAM_CHANGE = (EC_DVDBASE + 5);
var EC_DVD_ANGLE_CHANGE = (EC_DVDBASE + 6);
var EC_DVD_BUTTON_CHANGE = (EC_DVDBASE + 7);
var EC_DVD_VALID_UOPS_CHANGE = (EC_DVDBASE + 8);
var EC_DVD_STILL_ON = (EC_DVDBASE + 9);
var EC_DVD_STILL_OFF = (EC_DVDBASE + 10);
var EC_DVD_CURRENT_TIME = (EC_DVDBASE + 11); // not used by MSWebDVD
var EC_DVD_ERROR = (EC_DVDBASE + 12);
var EC_DVD_WARNING = (EC_DVDBASE + 13);
var EC_DVD_CHAPTER_AUTOSTOP = (EC_DVDBASE + 14);
var EC_DVD_NO_FP_PGC = (EC_DVDBASE + 15);
var EC_DVD_PLAYBACK_RATE_CHANGE = (EC_DVDBASE + 16);
var EC_DVD_PARENTAL_LEVEL_CHANGE = (EC_DVDBASE + 17);
var EC_DVD_PLAYBACK_STOPPED = (EC_DVDBASE + 18);
var EC_DVD_ANGLES_AVAILABLE = (EC_DVDBASE + 19);
var EC_DVD_PLAYPERIOD_AUTOSTOP = (EC_DVDBASE + 20);
var EC_DVD_BUTTON_AUTO_ACTIVATED = (EC_DVDBASE + 21);
var EC_DVD_CMD_START = (EC_DVDBASE + 22); // not used by MSWebDVD
var EC_DVD_CMD_END = (EC_DVDBASE + 23); // not used by MSWebDVD
var EC_DVD_DISC_EJECTED = (EC_DVDBASE + 24);
var EC_DVD_DISC_INSERTED = (EC_DVDBASE + 25);
var EC_DVD_CURRENT_HMSF_TIME = (EC_DVDBASE + 26);
var EC_DVD_KARAOKE_MODE = (EC_DVDBASE + 27);
var nCurDomain;
var nCurParentalLevel;
function ProcessDVDEvent(EventCode, Param1, Param2)
{
switch (EventCode)
{
case EC_DVD_DOMAIN_CHANGE:
nCurDomain = Param1;
// do something
break;
case EC_DVD_PARENTAL_LEVEL_CHANGE:
nCurParentalLevel = Param1;
// do something
break;
// handle any other events you are interested in
default:
break;
}
}
</SCRIPT>
處理用戶的事件通告
當(dāng)特定的用戶操作被允許或者被禁止的時(shí)候,MSWebDVD對(duì)象發(fā)送一個(gè)uop通報(bào)信息給應(yīng)用程序。每個(gè)用戶操作都有自己的事件,但它們都是一個(gè)Boolean量,僅僅用來(lái)標(biāo)識(shí)操作現(xiàn)在被允許或者被禁止。
對(duì)于每個(gè)你希望處理的事件,指定的事件處理者展示了一些代碼,讀者可以參閱。
<SCRIPT LANGUAGE="JScript" FOR=DVD EVENT="PlayForwards(bEnabled)">
PlayForwardsEventHandler(bEnabled)
</SCRIPT>
Now define your handler method to respond appropriately to the event. Assume that the "button_Play" variable here is the id attribute of the "Play" button in your application.
function PlayForwardsEventHander(bEnabled)
{
if(bEnabled == true)
button_Play.disabled = false;
else
button_Play.disabled = true;
}
同步滿足html要求的視頻
通過(guò)處理碟片的事件編碼事件,一個(gè)web應(yīng)用程序就可以同步滿足html的視頻了。例如,你可以使圖像和文字在這個(gè)頁(yè)面視頻上的指定點(diǎn)進(jìn)行變化。下面的代碼展示了一種通過(guò)時(shí)間編碼事件來(lái)同步j(luò)scipt函數(shù)的調(diào)用。
//DVDTriggerPoints array holds frame count for each trigger. Must be in ascending order.
//Use timecode2frames() to convert timecodes (hh:mm:ss:ff) to total number of frames.
var DVDTriggerPoints = new Array(
timecode2frames("01:15:24:00"),
timecode2frames("01:23:02:00"));
//DVDTriggerProcs array holds functions to be called at each trigger point defined in DVDTimePoints.
var DVDTriggerProcs = new Array(
"showDogPic();",
"showCatPic();");
//DVDTriggerIndex keeps track of current trigger (it indexes DVDTriggerPoints and DVDTriggerProcs).
var DVDTriggerIndex = 0;
//Handle DVD Events
function ProcessDVDEvent(EventCode, Param1, Param2) {
switch (EventCode) {
case EC_DVD_CURRENT_HMSF_TIME:
if(MSWebDVD.CurrentDomain == 4) { //Don't bother checking unless disc is playing.
if (DVDTriggerIndex < DVDTimePoints.length) { //Are there trigger points left to check?
currentDVDTime = (MSWebDVD.DVDTimeCode2bstr(Param1));
if (timecode2frames(currentDVDTime)>= DVDTriggerPoints[DVDTimeIndex]) {
// if trigger point has passed, execute the associated function
eval(DVDTriggerProcs[DVDTimeIndex++]);
}
}
}
break;
// handle other events
}
}
function timecode2frames(timeCode) {
if (timeCode != "undefined") {
return timeCode.substring(0,2)*108000
+ timeCode.substring(3,5)*1800
+ timeCode.substring(6,8)*30
+ timeCode.substring(9,11);
} else {
return 0;
}
}
用LCIDs進(jìn)行工作
LCID,或者可以叫做“l(fā)ocale identifer”,它是一個(gè)32位的數(shù)據(jù)類型,它是為了幫助我們鑒定不同的地區(qū)區(qū)碼語(yǔ)言。這些值的其中一項(xiàng)就是“主語(yǔ)言標(biāo)識(shí)”,這可以用來(lái)鑒定基本的區(qū)域語(yǔ)言。例如,英語(yǔ),西班牙語(yǔ)等。
MSWebDVD要求一個(gè)完整有效的LCID作為下面兩種方法的輸入?yún)?shù): SelectDefaultAudioLanguage和SelectDefaultSubpictureLanguage。這些可以是任何可被Windows識(shí)別的有效LCID,甚至也可以不被Windows識(shí)別。(主機(jī)不必一定支持本地機(jī)的字體、鍵盤映射等)下面列表寫出了一些通用LCIDs以及Windows默認(rèn)態(tài)不識(shí)別但對(duì)MSWebDVD有效的非通用LCIDs。該表不是完整的LCIDs列表。
一些有效的 LCIDs
Afrikaans 0x0436 Albanian 0x041c Arabic (Algeria) 0x1401
Arabic (Bahrain) 0x3c01 Arabic (Egypt) 0x0c01 Arabic (Iraq) 0x0801
Arabic (Jordan) 0x2c01 Arabic (Kuwait) 0x3401 Arabic (Lebanon) 0x3001
Arabic (Libya) 0x1001 Arabic (Morocco) 0x1801 Arabic (Oman) 0x2001
Arabic (Qatar) 0x4001 Arabic (Saudi Arabia) 0x0401 Arabic (Syria) 0x2801
Arabic (Tunisia) 0x1c01 Arabic (U.A.E.) 0x3801 Arabic (Yemen) 0x2401
Basque 0x042d Belarusian 0x0423 Bulgarian 0x0402
Catalan 0x0403 Chinese (Hong Kong) 0x0c04 Chinese (PRC) 0x0804
Chinese (Singapore) 0x1004 Chinese (Taiwan) 0x0404 Croatian 0x041a
Czech 0x0405 Danish 0x0406 Dutch (Belgian) 0x0813
Dutch (Standard) 0x0413 English (Australian) 0x0c09 English (Belize) 0x2809
English (Canadian) 0x1009 English (Caribbean) 0x2409 English (Ireland) 0x1809
English (Jamaica) 0x2009 English (New Zealand) 0x1409 English (South Africa) 0x1c09
English (Trinidad) 0x2c09 English (United Kingdom) 0x0809 English (United States) 0x0409
Estonian 0x0425 Faeroese 0x0438 Farsi 0x0429
Finnish 0x040b French (Belgian) 0x080c French (Canadian) 0x0c0c
French (Luxembourg) 0x140c French (Standard) 0x040c French (Swiss) 0x100c
German (Austrian) 0x0c07 German (Liechtenstein) 0x1407 German (Luxembourg) 0x1007
German (Standard) 0x0407 German (Swiss) 0x0807 Greek 0x0408
Hebrew 0x040d Hungarian 0x040e Icelandic 0x040f
Indonesian 0x0421 Italian (Standard) 0x0410 Italian (Swiss) 0x0810
Japanese 0x0411 Korean 0x0412 Korean (Johab) 0x0812
Latvian 0x0426 Lithuanian 0x0427 Malay (Malaysian) 0x043e
Malay (Brunei) 0x083e Norwegian (Bokmal) 0x0414 Norwegian (Nynorsk) 0x0814
Polish 0x0415 Portuguese (Brazilian) 0x0416 Portuguese (Standard) 0x0816
Romanian 0x0418 Russian 0x0419 Serbian (Cyrillic) 0x0c1a
Serbian (Latin) 0x081a Slovak 0x041b Slovenian 0x0424
Spanish (Argentina) 0x2c0a Spanish (Bolivia) 0x400a Spanish (Chile) 0x340a
Spanish (Colombia) 0x240a Spanish (Costa Rica) 0x140a Spanish (Dominican Republic) 0x1c0a
Spanish (Ecuador) 0x300a Spanish (El Salvador) 0x440a Spanish (Guatemala) 0x100a
Spanish (Honduras) 0x480a Spanish (Mexican) 0x080a Spanish (Modern Sort) 0x0c0a
Spanish (Nicaragua) 0x4c0a Spanish (Panama) 0x180a Spanish (Paraguay) 0x3c0a
Spanish (Peru) 0x280a Spanish (Puerto Rico) 0x500a Spanish (Traditional Sort) 0x040a
Spanish (Uruguay) 0x380a Spanish (Venezuela) 0x200a Swahili 0x0441
Swedish 0x041d Swedish (Finland) 0x081d Thai 0x041e
Turkish 0x041f Ukrainian 0x0422
一些MSWebDVD方法和屬性返回的LCID可以指定那一個(gè)標(biāo)識(shí)在音軌或者字幕上是有效的。為了使用這個(gè)信息,你的應(yīng)用程序?qū)⑿枰獜姆祷豅CID中選擇主語(yǔ)言標(biāo)識(shí)。為了達(dá)到這個(gè)目的,我們可以將iLCID和0x3ff進(jìn)行按位的與操作。以下代碼摘錄的演示了這種實(shí)現(xiàn)過(guò)程。(主語(yǔ)言標(biāo)識(shí)中包含了LCID中的至少10位標(biāo)記)
iPrimaryLang = iLCID & 0x3FF;
為了從主語(yǔ)言標(biāo)識(shí)中獲得人們可讀的字符串,調(diào)用GetLangFromLangID,代碼如下:
sLanguage = DVD.GetLangFromLangID(iPrimaryLang);
下面的列表展示了LCID中的主語(yǔ)言標(biāo)識(shí)。
Some Valid Primary Language IDs
Afrikaans 0x36 Albanian 0x1c Arabic 0x01 Basque 0x2d
Belarusian 0x23 Bulgarian 0x02 Catalan 0x03 Chinese 0x04
Croatian 0x1a Czech 0x05 Danish 0x06 Dutch 0x13
English 0x09 Estonian 0x25 Faeroese 0x38 Farsi 0x29
Finnish 0x0b French 0x0c German 0x07 Greek 0x08
Hebrew 0x0d Hungarian 0x0e Icelandic 0x0f Indonesian 0x21
Italian 0x10 Japanese 0x11 Korean 0x12 Latvian 0x26
Lithuanian 0x27 Malay 0x3e Norwegian 0x14 Polish 0x15
Portuguese 0x16 Romanian 0x18 Russian 0x19 Serbian 0x1a
Slovak 0x1b Slovenian 0x24 Spanish 0x0a Swahili 0x41
Swedish 0x1d Thai 0x1e Turkish 0x1f Ukrainian 0x22
播放卡拉ok碟片
卡拉ok碟片是dvd視頻碟片的一種,它有著和dvd視頻碟片相同的導(dǎo)航結(jié)構(gòu)。歌曲是按照一般節(jié)的格式存放的,節(jié)可以合成一個(gè)章,它是基本的播放單位。
對(duì)于卡拉ok碟片和普通dvd碟片的最大不同點(diǎn)就是音頻流的區(qū)別??ɡ璷k碟片是包含了所有的多通道音頻,通常是Dolby AC-3。通道0和1一般包括背景音效,2到5通道包含了嗓音,合成等音頻。一個(gè)卡拉ok應(yīng)用程序可以控制音量和目的喇叭,可以控制混音聲道。
卡拉ok的回放要求一個(gè)音頻解碼器,要求支持多通道的卡拉ok混音信息的解碼器。解碼器必需支持dvd卡拉ok屬性設(shè)置(AM_PROPERTY_DVDKARAOKE)。
當(dāng)DVD導(dǎo)航在碟片上檢測(cè)到卡拉ok的內(nèi)容的時(shí)候,它會(huì)自動(dòng)進(jìn)入卡拉ok模式,然后通知解碼器上面的三個(gè)混音通道那個(gè)應(yīng)該靜音,直到它們被應(yīng)用程序打開(kāi)。
1. 決定它們的內(nèi)容和混音通道數(shù)。
2. 提供一個(gè)用戶接口顯示通道的內(nèi)容,允許用戶可以在任何時(shí)間進(jìn)行混音通道的開(kāi)關(guān)。
Dvd的文字
Dvd 碟片,尤其是卡拉ok碟片,可能包含了一個(gè)文字信息的數(shù)據(jù)庫(kù)來(lái)補(bǔ)充視頻和音頻的內(nèi)容。象這樣的文字,在卡拉ok碟片上有可能會(huì)包括歌曲的標(biāo)題,藝術(shù)名,記錄標(biāo)簽等等內(nèi)容。這些文字可以被翻譯成不同的語(yǔ)言。這些字符串是可選擇的,碟片上不要求必需含有它們。現(xiàn)在它們的組織結(jié)構(gòu)是通過(guò)dvd卷標(biāo)的邏輯層次的近似鏡像的方法實(shí)現(xiàn)。
有兩種基本類型的字符串:結(jié)構(gòu)標(biāo)識(shí)和內(nèi)容標(biāo)識(shí)。這些類型用0x01到0x20的值是結(jié)構(gòu)標(biāo)識(shí)。它們是空的字符串,數(shù)字碼被用來(lái)標(biāo)識(shí)邏輯結(jié)構(gòu),表示內(nèi)容字符串是屬于那個(gè)邏輯結(jié)構(gòu)的。這個(gè)結(jié)構(gòu)非常符合dvd碟片內(nèi)容的邏輯結(jié)構(gòu):卷標(biāo),標(biāo)題,章節(jié)等等。剩下的內(nèi)容標(biāo)識(shí)是被用來(lái)顯示到用戶界面信息的字符串。
歷史上, DVD 碟片上的文本串在是唯一的,這些碟片大多使用0x01 和 0x02 結(jié)構(gòu)標(biāo)示符以及0x30 類型內(nèi)容字符串。但現(xiàn)在卻不是如此 (1) 越來(lái)越多類型的DVD-Video碟片包含文本串(2) 為了提供對(duì)碟片內(nèi)容的詳盡描述這些串以更加復(fù)雜的方式組織。下例代碼演示如何決定碟片上文本串語(yǔ)言塊的數(shù)目以及檢索讓用戶設(shè)置語(yǔ)言的可讀串。代碼中,串被添加于"TextLanguageList" HTML SELECT元素代碼。
function GetTextLanguages()
{
//get the number of text blocks
var numLangs = DVD.GetDVDTextNumberOfLanguages();
var iLCID;
var iPrimaryLang;
var sLanguage;
var oOption;
for (j = 0; j < numLangs; j++)
{
//get the locale identifier for the language block
iLCID = DVD.GetDVDTextLanguageLCID(j);
//get the primary language ID from the LCID
iPrimaryLang = iLCID & 0x3FF;
//get the human-readable string from the primary language ID
sLanguage = DVD.GetLangFromLangID(iPrimaryLang);
//add it to the SELECT element on the HTML page
oOption = document.createElement("OPTION");
oOption.text = sLanguage;
document.all.TextLanguageList.add(oOption);
}
} //end function GetTextStrings
下列檢測(cè)代碼演示如何枚舉串和檢查文本串類型。結(jié)果在名為"myTextArea"的HTML TEXTAREA 元素中,故可以看到數(shù)字串類型如何被用于組織內(nèi)容串。實(shí)程序會(huì)創(chuàng)建自己的數(shù)據(jù)結(jié)構(gòu)來(lái)包含串或以向用戶顯示串。
// iLanguage is the 0-based index for the language block
function GetTextStrings(iLanguage)
{
var numStrings, stringType, j;
numStrings = DVD.GetDVDTextNumberOfStrings(iLanguage);
for( j = 0; j < numStrings; j++)
{
stringType = DVD.GetDVDTextStringType(iLanguage, j);
if(stringType > 0x20) //there is actually some text to read here
{
myTextArea.value += (stringType + ": " + DVD.GetDVDTextString(iLanguage, j) + "\n");
}
else // It´s a node indicating what level of the volume structure
// the following strings will apply to
{
myTextArea.value += (stringType + "\n");
}
}
} //end function GetTextStrings
dvd文本字符串類型
這個(gè)表格列出了dvd文本字符串類型的子集。在0x20以下的字符串都是內(nèi)容字符串。大部分的歌曲名稱和標(biāo)題都是0x30。
結(jié)構(gòu)標(biāo)示符
Volume 0x01 指示串屬于DVD 卷
Title 0x02 標(biāo)題
ParentalID 0x03 指示串屬于特定 父ID.
Chapter 0x04 指示串屬于章
Cell 0x05 指示串屬于單元 (電影的一個(gè)場(chǎng)景)
流標(biāo)示符
Audio 0x10 指示串屬于音頻流
Subpicture 0x11 指示串屬于子圖流
Angle 0x12 指示串屬于角塊
音頻通道標(biāo)示符
Channel 0x20 指示串屬于音頻留的一個(gè)通道
通用內(nèi)容串
Name 0x30 標(biāo)題名、章名、歌曲名的通用標(biāo)示符
Comments 0x31 標(biāo)題、章、歌曲的通用內(nèi)容
標(biāo)題內(nèi)容串
Series 0x38 標(biāo)題、章、歌曲的附信息
Movie 0x39 電影的標(biāo)題或章的附加信息
Video 0x3a 視頻的標(biāo)題或章的附加信息
Album 0x3b 相冊(cè)的標(biāo)題或章的附加信息
Song 0x3c 歌曲的標(biāo)題或章的附加信息
Other 0x3f 其它的標(biāo)題或章的附加信息
第二標(biāo)題內(nèi)容串
Series 0x40 標(biāo)題、章、歌曲的附加信息
Movie 0x41 電影的標(biāo)題或章的附加信息
Video 0x42 視頻的標(biāo)題或章的附加信息
Album 0x43 相冊(cè)的標(biāo)題或章的附加信息
Song 0x44 歌曲的標(biāo)題或章的附加信息.
Other 0x45 其它的標(biāo)題或章的附加信息
原始內(nèi)容串
Series 0x48 標(biāo)題、章、歌曲的附加信息
Movie 0x49 電影的標(biāo)題或章的附加信息
Video 0x4a 視頻的標(biāo)題或章的附加信息
Album 0x4b 相冊(cè)的標(biāo)題或章的附加信息
Song 0x4c 歌曲的標(biāo)題或章的附加信息.
Other 0x4f 其它的標(biāo)題或章的附加信息
其它信息內(nèi)容串
Other Scene 0x50 電影標(biāo)題或章可選場(chǎng)景的附加信息
Other Cut 0x51 電影標(biāo)題或章可選剪輯的附加信息
Other Take 0x52 電影標(biāo)題或章可選畫面的附加信息
這個(gè)也是很久以前的東西了,不準(zhǔn)確的地方還請(qǐng)大家見(jiàn)諒.哎,我的一本書(shū)沒(méi)有被出版,就放到這里吧(出版社的人說(shuō)看不懂,呵呵,我都快暈死了)
基于腳本的dvd應(yīng)用程序
在網(wǎng)絡(luò)發(fā)展神速的今天,軟件業(yè)越來(lái)越注重基于網(wǎng)絡(luò)的應(yīng)用,下來(lái)我們就探討一下基于web的程序編寫。這里主要講述使用mswebdvd控件進(jìn)行dvd應(yīng)用程序的開(kāi)發(fā)過(guò)程。
插入MSWebDVD對(duì)象
MSWebDVD對(duì)象可以處理所有的dvd導(dǎo)航命令,并可以在web頁(yè)面上顯示視頻。這將比原來(lái)的處理過(guò)程簡(jiǎn)單很多,簡(jiǎn)單的插入代碼示例如下:
<OBJECT CLASSID=clsid:38EE5CEE-4B62-11D3-854F-00A0C9C898E7 ID=DVD
STYLE="height:369px; width:740px">
<PARAM NAME="BackColor" VALUE="1048592">
<PARAM NAME="EnableResetOnStop" VALUE="-1">
<PARAM NAME="ColorKey" VALUE="1048592">
</OBJECT>
允許用戶處理dvd命令
若允許用戶控制dvd播放器,則需要提供一個(gè)用戶界面來(lái)引導(dǎo)用戶,比如“播放”,“停止”按鈕。下面的代碼就展示了怎樣將一個(gè)html的按鈕和mswebdvd對(duì)象關(guān)聯(lián)起來(lái)。
<INPUT ID=button1 NAME="button1" TYPE=button VALUE="Play" onClick=´Play();´>
<INPUT ID=button2 NAME="button2" TYPE=button VALUE="Pause" onClick=´Pause();´>
<SCRIPT LANGUAGE="JScript">
function Play(){
DVD.Play();
}
function Pause(){
DVD.Pause();
}
</SCRIPT>
用dvd菜單進(jìn)行工作
當(dāng)用戶點(diǎn)擊屏幕的按鈕時(shí),Mswebdvd會(huì)自動(dòng)的處理菜單命令。應(yīng)用程序不需要處理任何事情來(lái)實(shí)現(xiàn)對(duì)鼠標(biāo)的支持。但是應(yīng)用程序可以不考慮這個(gè)自動(dòng)處理過(guò)程。如果你對(duì)定制鼠標(biāo)工作十分感興趣,那么你可以使用mswebdvd關(guān)聯(lián)菜單的方法,比如SelectAndActivateButton, GetButtonAtPosition。要想徹底的禁止鼠標(biāo)的自動(dòng)化動(dòng)作處理,那么設(shè)置DisableAutoMouseProcessing屬性為真就可以了。
音頻和子圖流
一個(gè)dvd碟片可以處理8路音頻流,從0―7,每個(gè)音頻流又包含了6個(gè)獨(dú)立的通道。只有這些流在能在任何時(shí)間被激活。對(duì)于子圖來(lái)說(shuō),有32個(gè)流是有效的,從0-31。碟片通常制作成默認(rèn)的音頻和子圖流,但一個(gè)應(yīng)用程序允許用戶看到所有有效的流數(shù)據(jù),然后選擇一種他們喜歡的語(yǔ)言。基本步驟的處理和音頻與子圖流相同。
1. 決定指定標(biāo)題的有效流的數(shù)量。
2. 重新檢測(cè)每個(gè)流的屬性。
3. 從本地標(biāo)識(shí)中返回語(yǔ)言代碼,然后創(chuàng)建人們可讀的字符串。
4. 添加“選擇”對(duì)話框,或者別的用戶界面來(lái)允許用戶選擇首選的數(shù)據(jù)流。
(注意音頻和子圖流標(biāo)記是從0開(kāi)始的,然而別的大部分都是從1開(kāi)始)
強(qiáng)制父級(jí)管理層
在dvd碟片中通常任何的標(biāo)題或者標(biāo)題的一部分會(huì)被標(biāo)記一個(gè)父級(jí)管理層(PML)
從1到8,8級(jí)是限制最多的,1級(jí)是限制最少的等級(jí)。有一種想法提供了一種裝置來(lái)防止小孩看成人的內(nèi)容,但每個(gè)國(guó)家的特殊性決定了他們將不會(huì)一樣。在美國(guó)和加拿大是一種標(biāo)準(zhǔn),和別的國(guó)家就不太一樣。
MSWebDVD對(duì)象默認(rèn)狀態(tài)是忽略pmls的。對(duì)于應(yīng)用程序來(lái)講,它將會(huì)通報(bào)pml標(biāo)記,這樣必需調(diào)用NotifyParentalLevels(true)。當(dāng)在碟片上碰到pml信息的時(shí)候,MSWebDVD將會(huì)通知你的應(yīng)用程序。為了強(qiáng)制pmls,你的應(yīng)用程序必需實(shí)現(xiàn)一些邏輯口令來(lái)將用戶和不同的級(jí)別聯(lián)系在一起,響應(yīng)EC_DVD_PARENTAL_LEVEL_CHANGE事件來(lái)允許或者禁止訪問(wèn)。
保存和恢復(fù)書(shū)簽
書(shū)簽是一個(gè)MSWebDVD對(duì)象內(nèi)部的數(shù)據(jù)結(jié)構(gòu),它可以被用來(lái)創(chuàng)建一個(gè)當(dāng)前用戶任務(wù)的快照,包含內(nèi)容比如是當(dāng)前碟片位置的信息,私人的父層管理級(jí)別,選擇音頻和子圖流等等。這個(gè)意思是讓用戶可以保存當(dāng)前的dvd狀態(tài)可以下次接著從這個(gè)狀態(tài)中繼續(xù)觀看。
SaveBookmark方法允許用戶保存他們碟片的位置,RestoreBookmark方法則允許同一個(gè)用戶可以接著上次儲(chǔ)存的位置接著觀看。
一次只能儲(chǔ)存一個(gè)書(shū)簽。如果你調(diào)用了兩次SaveBookmark,那么第一次的書(shū)簽將會(huì)被第二次的書(shū)簽覆蓋。書(shū)簽對(duì)于計(jì)算機(jī)來(lái)說(shuō)是特別的。在不同的計(jì)算機(jī)中運(yùn)行同樣的html頁(yè)面,然后調(diào)用RestoreBookmark將會(huì)恢復(fù)最近的那次存儲(chǔ)的書(shū)簽,或者返回一個(gè)以前沒(méi)有存儲(chǔ)的標(biāo)志錯(cuò)誤。
處理dvd通報(bào)事件
當(dāng)某種事件發(fā)生了的時(shí)候,MSWebDVD對(duì)象會(huì)向應(yīng)用程序發(fā)送一個(gè)特定的通報(bào)事件,例如當(dāng)DVD的域改變了,當(dāng)遇到一個(gè)新的父層管理等等。事件參數(shù)可以獲得與事件有關(guān)的附加信息。錯(cuò)誤信息和警告信息都是通過(guò)這種方法進(jìn)行發(fā)送的。為了撲獲到變化的dvd事件通報(bào),在html SCRIPT中加入以下代碼。
<SCRIPT LANGUAGE="JScript" FOR=DVD EVENT="DVDNotify(EventCode, Param1, Param2)">
ProcessDVDEvent(EventCode, Param1, Param2)
</SCRIPT>
然后,在腳本中,定義事件代碼和ProcessDVDEvent函數(shù),下面的代碼將展示它的用法。(你可以給你的事件處理函數(shù)任何的名稱)
<SCRIPT LANGUAGE="JScript">
// DVD event codes are valued 257 through 283
var EC_DVDBASE = 256;
var EC_DVD_DOMAIN_CHANGE = (EC_DVDBASE + 1);
var EC_DVD_TITLE_CHANGE = (EC_DVDBASE + 2);
var EC_DVD_CHAPTER_START = (EC_DVDBASE + 3);
var EC_DVD_AUDIO_STREAM_CHANGE = (EC_DVDBASE + 4);
var EC_DVD_SUBPICTURE_STREAM_CHANGE = (EC_DVDBASE + 5);
var EC_DVD_ANGLE_CHANGE = (EC_DVDBASE + 6);
var EC_DVD_BUTTON_CHANGE = (EC_DVDBASE + 7);
var EC_DVD_VALID_UOPS_CHANGE = (EC_DVDBASE + 8);
var EC_DVD_STILL_ON = (EC_DVDBASE + 9);
var EC_DVD_STILL_OFF = (EC_DVDBASE + 10);
var EC_DVD_CURRENT_TIME = (EC_DVDBASE + 11); // not used by MSWebDVD
var EC_DVD_ERROR = (EC_DVDBASE + 12);
var EC_DVD_WARNING = (EC_DVDBASE + 13);
var EC_DVD_CHAPTER_AUTOSTOP = (EC_DVDBASE + 14);
var EC_DVD_NO_FP_PGC = (EC_DVDBASE + 15);
var EC_DVD_PLAYBACK_RATE_CHANGE = (EC_DVDBASE + 16);
var EC_DVD_PARENTAL_LEVEL_CHANGE = (EC_DVDBASE + 17);
var EC_DVD_PLAYBACK_STOPPED = (EC_DVDBASE + 18);
var EC_DVD_ANGLES_AVAILABLE = (EC_DVDBASE + 19);
var EC_DVD_PLAYPERIOD_AUTOSTOP = (EC_DVDBASE + 20);
var EC_DVD_BUTTON_AUTO_ACTIVATED = (EC_DVDBASE + 21);
var EC_DVD_CMD_START = (EC_DVDBASE + 22); // not used by MSWebDVD
var EC_DVD_CMD_END = (EC_DVDBASE + 23); // not used by MSWebDVD
var EC_DVD_DISC_EJECTED = (EC_DVDBASE + 24);
var EC_DVD_DISC_INSERTED = (EC_DVDBASE + 25);
var EC_DVD_CURRENT_HMSF_TIME = (EC_DVDBASE + 26);
var EC_DVD_KARAOKE_MODE = (EC_DVDBASE + 27);
var nCurDomain;
var nCurParentalLevel;
function ProcessDVDEvent(EventCode, Param1, Param2)
{
switch (EventCode)
{
case EC_DVD_DOMAIN_CHANGE:
nCurDomain = Param1;
// do something
break;
case EC_DVD_PARENTAL_LEVEL_CHANGE:
nCurParentalLevel = Param1;
// do something
break;
// handle any other events you are interested in
default:
break;
}
}
</SCRIPT>
處理用戶的事件通告
當(dāng)特定的用戶操作被允許或者被禁止的時(shí)候,MSWebDVD對(duì)象發(fā)送一個(gè)uop通報(bào)信息給應(yīng)用程序。每個(gè)用戶操作都有自己的事件,但它們都是一個(gè)Boolean量,僅僅用來(lái)標(biāo)識(shí)操作現(xiàn)在被允許或者被禁止。
對(duì)于每個(gè)你希望處理的事件,指定的事件處理者展示了一些代碼,讀者可以參閱。
<SCRIPT LANGUAGE="JScript" FOR=DVD EVENT="PlayForwards(bEnabled)">
PlayForwardsEventHandler(bEnabled)
</SCRIPT>
Now define your handler method to respond appropriately to the event. Assume that the "button_Play" variable here is the id attribute of the "Play" button in your application.
function PlayForwardsEventHander(bEnabled)
{
if(bEnabled == true)
button_Play.disabled = false;
else
button_Play.disabled = true;
}
同步滿足html要求的視頻
通過(guò)處理碟片的事件編碼事件,一個(gè)web應(yīng)用程序就可以同步滿足html的視頻了。例如,你可以使圖像和文字在這個(gè)頁(yè)面視頻上的指定點(diǎn)進(jìn)行變化。下面的代碼展示了一種通過(guò)時(shí)間編碼事件來(lái)同步j(luò)scipt函數(shù)的調(diào)用。
//DVDTriggerPoints array holds frame count for each trigger. Must be in ascending order.
//Use timecode2frames() to convert timecodes (hh:mm:ss:ff) to total number of frames.
var DVDTriggerPoints = new Array(
timecode2frames("01:15:24:00"),
timecode2frames("01:23:02:00"));
//DVDTriggerProcs array holds functions to be called at each trigger point defined in DVDTimePoints.
var DVDTriggerProcs = new Array(
"showDogPic();",
"showCatPic();");
//DVDTriggerIndex keeps track of current trigger (it indexes DVDTriggerPoints and DVDTriggerProcs).
var DVDTriggerIndex = 0;
//Handle DVD Events
function ProcessDVDEvent(EventCode, Param1, Param2) {
switch (EventCode) {
case EC_DVD_CURRENT_HMSF_TIME:
if(MSWebDVD.CurrentDomain == 4) { //Don't bother checking unless disc is playing.
if (DVDTriggerIndex < DVDTimePoints.length) { //Are there trigger points left to check?
currentDVDTime = (MSWebDVD.DVDTimeCode2bstr(Param1));
if (timecode2frames(currentDVDTime)>= DVDTriggerPoints[DVDTimeIndex]) {
// if trigger point has passed, execute the associated function
eval(DVDTriggerProcs[DVDTimeIndex++]);
}
}
}
break;
// handle other events
}
}
function timecode2frames(timeCode) {
if (timeCode != "undefined") {
return timeCode.substring(0,2)*108000
+ timeCode.substring(3,5)*1800
+ timeCode.substring(6,8)*30
+ timeCode.substring(9,11);
} else {
return 0;
}
}
用LCIDs進(jìn)行工作
LCID,或者可以叫做“l(fā)ocale identifer”,它是一個(gè)32位的數(shù)據(jù)類型,它是為了幫助我們鑒定不同的地區(qū)區(qū)碼語(yǔ)言。這些值的其中一項(xiàng)就是“主語(yǔ)言標(biāo)識(shí)”,這可以用來(lái)鑒定基本的區(qū)域語(yǔ)言。例如,英語(yǔ),西班牙語(yǔ)等。
MSWebDVD要求一個(gè)完整有效的LCID作為下面兩種方法的輸入?yún)?shù): SelectDefaultAudioLanguage和SelectDefaultSubpictureLanguage。這些可以是任何可被Windows識(shí)別的有效LCID,甚至也可以不被Windows識(shí)別。(主機(jī)不必一定支持本地機(jī)的字體、鍵盤映射等)下面列表寫出了一些通用LCIDs以及Windows默認(rèn)態(tài)不識(shí)別但對(duì)MSWebDVD有效的非通用LCIDs。該表不是完整的LCIDs列表。
一些有效的 LCIDs
Afrikaans 0x0436 Albanian 0x041c Arabic (Algeria) 0x1401
Arabic (Bahrain) 0x3c01 Arabic (Egypt) 0x0c01 Arabic (Iraq) 0x0801
Arabic (Jordan) 0x2c01 Arabic (Kuwait) 0x3401 Arabic (Lebanon) 0x3001
Arabic (Libya) 0x1001 Arabic (Morocco) 0x1801 Arabic (Oman) 0x2001
Arabic (Qatar) 0x4001 Arabic (Saudi Arabia) 0x0401 Arabic (Syria) 0x2801
Arabic (Tunisia) 0x1c01 Arabic (U.A.E.) 0x3801 Arabic (Yemen) 0x2401
Basque 0x042d Belarusian 0x0423 Bulgarian 0x0402
Catalan 0x0403 Chinese (Hong Kong) 0x0c04 Chinese (PRC) 0x0804
Chinese (Singapore) 0x1004 Chinese (Taiwan) 0x0404 Croatian 0x041a
Czech 0x0405 Danish 0x0406 Dutch (Belgian) 0x0813
Dutch (Standard) 0x0413 English (Australian) 0x0c09 English (Belize) 0x2809
English (Canadian) 0x1009 English (Caribbean) 0x2409 English (Ireland) 0x1809
English (Jamaica) 0x2009 English (New Zealand) 0x1409 English (South Africa) 0x1c09
English (Trinidad) 0x2c09 English (United Kingdom) 0x0809 English (United States) 0x0409
Estonian 0x0425 Faeroese 0x0438 Farsi 0x0429
Finnish 0x040b French (Belgian) 0x080c French (Canadian) 0x0c0c
French (Luxembourg) 0x140c French (Standard) 0x040c French (Swiss) 0x100c
German (Austrian) 0x0c07 German (Liechtenstein) 0x1407 German (Luxembourg) 0x1007
German (Standard) 0x0407 German (Swiss) 0x0807 Greek 0x0408
Hebrew 0x040d Hungarian 0x040e Icelandic 0x040f
Indonesian 0x0421 Italian (Standard) 0x0410 Italian (Swiss) 0x0810
Japanese 0x0411 Korean 0x0412 Korean (Johab) 0x0812
Latvian 0x0426 Lithuanian 0x0427 Malay (Malaysian) 0x043e
Malay (Brunei) 0x083e Norwegian (Bokmal) 0x0414 Norwegian (Nynorsk) 0x0814
Polish 0x0415 Portuguese (Brazilian) 0x0416 Portuguese (Standard) 0x0816
Romanian 0x0418 Russian 0x0419 Serbian (Cyrillic) 0x0c1a
Serbian (Latin) 0x081a Slovak 0x041b Slovenian 0x0424
Spanish (Argentina) 0x2c0a Spanish (Bolivia) 0x400a Spanish (Chile) 0x340a
Spanish (Colombia) 0x240a Spanish (Costa Rica) 0x140a Spanish (Dominican Republic) 0x1c0a
Spanish (Ecuador) 0x300a Spanish (El Salvador) 0x440a Spanish (Guatemala) 0x100a
Spanish (Honduras) 0x480a Spanish (Mexican) 0x080a Spanish (Modern Sort) 0x0c0a
Spanish (Nicaragua) 0x4c0a Spanish (Panama) 0x180a Spanish (Paraguay) 0x3c0a
Spanish (Peru) 0x280a Spanish (Puerto Rico) 0x500a Spanish (Traditional Sort) 0x040a
Spanish (Uruguay) 0x380a Spanish (Venezuela) 0x200a Swahili 0x0441
Swedish 0x041d Swedish (Finland) 0x081d Thai 0x041e
Turkish 0x041f Ukrainian 0x0422
一些MSWebDVD方法和屬性返回的LCID可以指定那一個(gè)標(biāo)識(shí)在音軌或者字幕上是有效的。為了使用這個(gè)信息,你的應(yīng)用程序?qū)⑿枰獜姆祷豅CID中選擇主語(yǔ)言標(biāo)識(shí)。為了達(dá)到這個(gè)目的,我們可以將iLCID和0x3ff進(jìn)行按位的與操作。以下代碼摘錄的演示了這種實(shí)現(xiàn)過(guò)程。(主語(yǔ)言標(biāo)識(shí)中包含了LCID中的至少10位標(biāo)記)
iPrimaryLang = iLCID & 0x3FF;
為了從主語(yǔ)言標(biāo)識(shí)中獲得人們可讀的字符串,調(diào)用GetLangFromLangID,代碼如下:
sLanguage = DVD.GetLangFromLangID(iPrimaryLang);
下面的列表展示了LCID中的主語(yǔ)言標(biāo)識(shí)。
Some Valid Primary Language IDs
Afrikaans 0x36 Albanian 0x1c Arabic 0x01 Basque 0x2d
Belarusian 0x23 Bulgarian 0x02 Catalan 0x03 Chinese 0x04
Croatian 0x1a Czech 0x05 Danish 0x06 Dutch 0x13
English 0x09 Estonian 0x25 Faeroese 0x38 Farsi 0x29
Finnish 0x0b French 0x0c German 0x07 Greek 0x08
Hebrew 0x0d Hungarian 0x0e Icelandic 0x0f Indonesian 0x21
Italian 0x10 Japanese 0x11 Korean 0x12 Latvian 0x26
Lithuanian 0x27 Malay 0x3e Norwegian 0x14 Polish 0x15
Portuguese 0x16 Romanian 0x18 Russian 0x19 Serbian 0x1a
Slovak 0x1b Slovenian 0x24 Spanish 0x0a Swahili 0x41
Swedish 0x1d Thai 0x1e Turkish 0x1f Ukrainian 0x22
播放卡拉ok碟片
卡拉ok碟片是dvd視頻碟片的一種,它有著和dvd視頻碟片相同的導(dǎo)航結(jié)構(gòu)。歌曲是按照一般節(jié)的格式存放的,節(jié)可以合成一個(gè)章,它是基本的播放單位。
對(duì)于卡拉ok碟片和普通dvd碟片的最大不同點(diǎn)就是音頻流的區(qū)別??ɡ璷k碟片是包含了所有的多通道音頻,通常是Dolby AC-3。通道0和1一般包括背景音效,2到5通道包含了嗓音,合成等音頻。一個(gè)卡拉ok應(yīng)用程序可以控制音量和目的喇叭,可以控制混音聲道。
卡拉ok的回放要求一個(gè)音頻解碼器,要求支持多通道的卡拉ok混音信息的解碼器。解碼器必需支持dvd卡拉ok屬性設(shè)置(AM_PROPERTY_DVDKARAOKE)。
當(dāng)DVD導(dǎo)航在碟片上檢測(cè)到卡拉ok的內(nèi)容的時(shí)候,它會(huì)自動(dòng)進(jìn)入卡拉ok模式,然后通知解碼器上面的三個(gè)混音通道那個(gè)應(yīng)該靜音,直到它們被應(yīng)用程序打開(kāi)。
1. 決定它們的內(nèi)容和混音通道數(shù)。
2. 提供一個(gè)用戶接口顯示通道的內(nèi)容,允許用戶可以在任何時(shí)間進(jìn)行混音通道的開(kāi)關(guān)。
Dvd的文字
Dvd 碟片,尤其是卡拉ok碟片,可能包含了一個(gè)文字信息的數(shù)據(jù)庫(kù)來(lái)補(bǔ)充視頻和音頻的內(nèi)容。象這樣的文字,在卡拉ok碟片上有可能會(huì)包括歌曲的標(biāo)題,藝術(shù)名,記錄標(biāo)簽等等內(nèi)容。這些文字可以被翻譯成不同的語(yǔ)言。這些字符串是可選擇的,碟片上不要求必需含有它們。現(xiàn)在它們的組織結(jié)構(gòu)是通過(guò)dvd卷標(biāo)的邏輯層次的近似鏡像的方法實(shí)現(xiàn)。
有兩種基本類型的字符串:結(jié)構(gòu)標(biāo)識(shí)和內(nèi)容標(biāo)識(shí)。這些類型用0x01到0x20的值是結(jié)構(gòu)標(biāo)識(shí)。它們是空的字符串,數(shù)字碼被用來(lái)標(biāo)識(shí)邏輯結(jié)構(gòu),表示內(nèi)容字符串是屬于那個(gè)邏輯結(jié)構(gòu)的。這個(gè)結(jié)構(gòu)非常符合dvd碟片內(nèi)容的邏輯結(jié)構(gòu):卷標(biāo),標(biāo)題,章節(jié)等等。剩下的內(nèi)容標(biāo)識(shí)是被用來(lái)顯示到用戶界面信息的字符串。
歷史上, DVD 碟片上的文本串在是唯一的,這些碟片大多使用0x01 和 0x02 結(jié)構(gòu)標(biāo)示符以及0x30 類型內(nèi)容字符串。但現(xiàn)在卻不是如此 (1) 越來(lái)越多類型的DVD-Video碟片包含文本串(2) 為了提供對(duì)碟片內(nèi)容的詳盡描述這些串以更加復(fù)雜的方式組織。下例代碼演示如何決定碟片上文本串語(yǔ)言塊的數(shù)目以及檢索讓用戶設(shè)置語(yǔ)言的可讀串。代碼中,串被添加于"TextLanguageList" HTML SELECT元素代碼。
function GetTextLanguages()
{
//get the number of text blocks
var numLangs = DVD.GetDVDTextNumberOfLanguages();
var iLCID;
var iPrimaryLang;
var sLanguage;
var oOption;
for (j = 0; j < numLangs; j++)
{
//get the locale identifier for the language block
iLCID = DVD.GetDVDTextLanguageLCID(j);
//get the primary language ID from the LCID
iPrimaryLang = iLCID & 0x3FF;
//get the human-readable string from the primary language ID
sLanguage = DVD.GetLangFromLangID(iPrimaryLang);
//add it to the SELECT element on the HTML page
oOption = document.createElement("OPTION");
oOption.text = sLanguage;
document.all.TextLanguageList.add(oOption);
}
} //end function GetTextStrings
下列檢測(cè)代碼演示如何枚舉串和檢查文本串類型。結(jié)果在名為"myTextArea"的HTML TEXTAREA 元素中,故可以看到數(shù)字串類型如何被用于組織內(nèi)容串。實(shí)程序會(huì)創(chuàng)建自己的數(shù)據(jù)結(jié)構(gòu)來(lái)包含串或以向用戶顯示串。
// iLanguage is the 0-based index for the language block
function GetTextStrings(iLanguage)
{
var numStrings, stringType, j;
numStrings = DVD.GetDVDTextNumberOfStrings(iLanguage);
for( j = 0; j < numStrings; j++)
{
stringType = DVD.GetDVDTextStringType(iLanguage, j);
if(stringType > 0x20) //there is actually some text to read here
{
myTextArea.value += (stringType + ": " + DVD.GetDVDTextString(iLanguage, j) + "\n");
}
else // It´s a node indicating what level of the volume structure
// the following strings will apply to
{
myTextArea.value += (stringType + "\n");
}
}
} //end function GetTextStrings
dvd文本字符串類型
這個(gè)表格列出了dvd文本字符串類型的子集。在0x20以下的字符串都是內(nèi)容字符串。大部分的歌曲名稱和標(biāo)題都是0x30。
結(jié)構(gòu)標(biāo)示符
Volume 0x01 指示串屬于DVD 卷
Title 0x02 標(biāo)題
ParentalID 0x03 指示串屬于特定 父ID.
Chapter 0x04 指示串屬于章
Cell 0x05 指示串屬于單元 (電影的一個(gè)場(chǎng)景)
流標(biāo)示符
Audio 0x10 指示串屬于音頻流
Subpicture 0x11 指示串屬于子圖流
Angle 0x12 指示串屬于角塊
音頻通道標(biāo)示符
Channel 0x20 指示串屬于音頻留的一個(gè)通道
通用內(nèi)容串
Name 0x30 標(biāo)題名、章名、歌曲名的通用標(biāo)示符
Comments 0x31 標(biāo)題、章、歌曲的通用內(nèi)容
標(biāo)題內(nèi)容串
Series 0x38 標(biāo)題、章、歌曲的附信息
Movie 0x39 電影的標(biāo)題或章的附加信息
Video 0x3a 視頻的標(biāo)題或章的附加信息
Album 0x3b 相冊(cè)的標(biāo)題或章的附加信息
Song 0x3c 歌曲的標(biāo)題或章的附加信息
Other 0x3f 其它的標(biāo)題或章的附加信息
第二標(biāo)題內(nèi)容串
Series 0x40 標(biāo)題、章、歌曲的附加信息
Movie 0x41 電影的標(biāo)題或章的附加信息
Video 0x42 視頻的標(biāo)題或章的附加信息
Album 0x43 相冊(cè)的標(biāo)題或章的附加信息
Song 0x44 歌曲的標(biāo)題或章的附加信息.
Other 0x45 其它的標(biāo)題或章的附加信息
原始內(nèi)容串
Series 0x48 標(biāo)題、章、歌曲的附加信息
Movie 0x49 電影的標(biāo)題或章的附加信息
Video 0x4a 視頻的標(biāo)題或章的附加信息
Album 0x4b 相冊(cè)的標(biāo)題或章的附加信息
Song 0x4c 歌曲的標(biāo)題或章的附加信息.
Other 0x4f 其它的標(biāo)題或章的附加信息
其它信息內(nèi)容串
Other Scene 0x50 電影標(biāo)題或章可選場(chǎng)景的附加信息
Other Cut 0x51 電影標(biāo)題或章可選剪輯的附加信息
Other Take 0x52 電影標(biāo)題或章可選畫面的附加信息
相關(guān)文章
Verilog語(yǔ)言數(shù)據(jù)類型基礎(chǔ)教程
這篇文章主要為大家介紹了Verilog語(yǔ)言數(shù)據(jù)類型基礎(chǔ)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04關(guān)于學(xué)習(xí) Flex 的一點(diǎn)建議(轉(zhuǎn)載)
關(guān)于學(xué)習(xí) Flex 的一點(diǎn)建議(轉(zhuǎn)載)...2007-01-01Verilog語(yǔ)言關(guān)鍵字模塊例化實(shí)例講解
這篇文章主要為大家介紹了Verilog語(yǔ)言關(guān)鍵字模塊例化實(shí)例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Verilog關(guān)鍵詞的條件語(yǔ)句實(shí)例詳解
這篇文章主要為大家介紹了Verilog關(guān)鍵詞的條件語(yǔ)句實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04前端SVG樣式顏色等開(kāi)發(fā)注意事項(xiàng)
這篇文章主要介紹了前端SVG樣式顏色等開(kāi)發(fā)注意事項(xiàng),需要的朋友可以參考下2022-01-01