好像包含表格不能发表,只有先拷贝到记事本里面才可以,所以格式都丢了,不好意思
这个也是很久以前的东西了,不准确的地方还请大家见谅.哎,我的一本书没有被出版,就放到这里吧(出版社的人说看不懂,呵呵,我都快晕死了)
基于脚本的dvd应用程序
在网络发展神速的今天,软件业越来越注重基于网络的应用,下来我们就探讨一下基于web的程序编写。这里主要讲述使用mswebdvd控件进行dvd应用程序的开发过程。
插入MSWebDVD对象
MSWebDVD对象可以处理所有的dvd导航命令,并可以在web页面上显示视频。这将比原来的处理过程简单很多,简单的插入代码示例如下:
<OBJECTCLASSID=clsid:38EE5CEE-4B62-11D3-854F-00A0C9C898E7ID=DVD
>
<PARAMNAME="BackColor"VALUE="1048592">
<PARAMNAME="EnableResetOnStop"VALUE="-1">
<PARAMNAME="ColorKey"VALUE="1048592">
</OBJECT>
允许用户处理dvd命令
若允许用户控制dvd播放器,则需要提供一个用户界面来引导用户,比如“播放”,“停止”按钮。下面的代码就展示了怎样将一个html的按钮和mswebdvd对象关联起来。
<INPUTID=button1NAME="button1"TYPE=buttonVALUE="Play"onClick=´Play();´>
<INPUTID=button2NAME="button2"TYPE=buttonVALUE="Pause"onClick=´Pause();´>
<SCRIPTLANGUAGE="JScript">
functionPlay(){
DVD.Play();
}
functionPause(){
DVD.Pause();
}
</SCRIPT>
用dvd菜单进行工作
当用户点击屏幕的按钮时,Mswebdvd会自动的处理菜单命令。应用程序不需要处理任何事情来实现对鼠标的支持。但是应用程序可以不考虑这个自动处理过程。如果你对定制鼠标工作十分感兴趣,那么你可以使用mswebdvd关联菜单的方法,比如SelectAndActivateButton,GetButtonAtPosition。要想彻底的禁止鼠标的自动化动作处理,那么设置DisableAutoMouseProcessing属性为真就可以了。
音频和子图流
一个dvd碟片可以处理8路音频流,从0―7,每个音频流又包含了6个独立的通道。只有这些流在能在任何时间被激活。对于子图来说,有32个流是有效的,从0-31。碟片通常制作成默认的音频和子图流,但一个应用程序允许用户看到所有有效的流数据,然后选择一种他们喜欢的语言。基本步骤的处理和音频与子图流相同。
1.决定指定标题的有效流的数量。
2.重新检测每个流的属性。
3.从本地标识中返回语言代码,然后创建人们可读的字符串。
4.添加“选择”对话框,或者别的用户界面来允许用户选择首选的数据流。
(注意音频和子图流标记是从0开始的,然而别的大部分都是从1开始)
强制父级管理层
在dvd碟片中通常任何的标题或者标题的一部分会被标记一个父级管理层(PML)
从1到8,8级是限制最多的,1级是限制最少的等级。有一种想法提供了一种装置来防止小孩看成人的内容,但每个国家的特殊性决定了他们将不会一样。在美国和加拿大是一种标准,和别的国家就不太一样。
MSWebDVD对象默认状态是忽略pmls的。对于应用程序来讲,它将会通报pml标记,这样必需调用NotifyParentalLevels(true)。当在碟片上碰到pml信息的时候,MSWebDVD将会通知你的应用程序。为了强制pmls,你的应用程序必需实现一些逻辑口令来将用户和不同的级别联系在一起,响应EC_DVD_PARENTAL_LEVEL_CHANGE事件来允许或者禁止访问。
保存和恢复书签
书签是一个MSWebDVD对象内部的数据结构,它可以被用来创建一个当前用户任务的快照,包含内容比如是当前碟片位置的信息,私人的父层管理级别,选择音频和子图流等等。这个意思是让用户可以保存当前的dvd状态可以下次接着从这个状态中继续观看。
SaveBookmark方法允许用户保存他们碟片的位置,RestoreBookmark方法则允许同一个用户可以接着上次储存的位置接着观看。
一次只能储存一个书签。如果你调用了两次SaveBookmark,那么第一次的书签将会被第二次的书签覆盖。书签对于计算机来说是特别的。在不同的计算机中运行同样的html页面,然后调用RestoreBookmark将会恢复最近的那次存储的书签,或者返回一个以前没有存储的标志错误。
处理dvd通报事件
当某种事件发生了的时候,MSWebDVD对象会向应用程序发送一个特定的通报事件,例如当DVD的域改变了,当遇到一个新的父层管理等等。事件参数可以获得与事件有关的附加信息。错误信息和警告信息都是通过这种方法进行发送的。为了扑获到变化的dvd事件通报,在htmlSCRIPT中加入以下代码。
<SCRIPTLANGUAGE="JScript"FOR=DVDEVENT="DVDNotify(EventCode,Param1,Param2)">
ProcessDVDEvent(EventCode,Param1,Param2)
</SCRIPT>
然后,在脚本中,定义事件代码和ProcessDVDEvent函数,下面的代码将展示它的用法。(你可以给你的事件处理函数任何的名称)
<SCRIPTLANGUAGE="JScript">
//DVDeventcodesarevalued257through283
varEC_DVDBASE=256;
varEC_DVD_DOMAIN_CHANGE=(EC_DVDBASE+1);
varEC_DVD_TITLE_CHANGE=(EC_DVDBASE+2);
varEC_DVD_CHAPTER_START=(EC_DVDBASE+3);
varEC_DVD_AUDIO_STREAM_CHANGE=(EC_DVDBASE+4);
varEC_DVD_SUBPICTURE_STREAM_CHANGE=(EC_DVDBASE+5);
varEC_DVD_ANGLE_CHANGE=(EC_DVDBASE+6);
varEC_DVD_BUTTON_CHANGE=(EC_DVDBASE+7);
varEC_DVD_VALID_UOPS_CHANGE=(EC_DVDBASE+8);
varEC_DVD_STILL_ON=(EC_DVDBASE+9);
varEC_DVD_STILL_OFF=(EC_DVDBASE+10);
varEC_DVD_CURRENT_TIME=(EC_DVDBASE+11);//notusedbyMSWebDVD
varEC_DVD_ERROR=(EC_DVDBASE+12);
varEC_DVD_WARNING=(EC_DVDBASE+13);
varEC_DVD_CHAPTER_AUTOSTOP=(EC_DVDBASE+14);
varEC_DVD_NO_FP_PGC=(EC_DVDBASE+15);
varEC_DVD_PLAYBACK_RATE_CHANGE=(EC_DVDBASE+16);
varEC_DVD_PARENTAL_LEVEL_CHANGE=(EC_DVDBASE+17);
varEC_DVD_PLAYBACK_STOPPED=(EC_DVDBASE+18);
varEC_DVD_ANGLES_AVAILABLE=(EC_DVDBASE+19);
varEC_DVD_PLAYPERIOD_AUTOSTOP=(EC_DVDBASE+20);
varEC_DVD_BUTTON_AUTO_ACTIVATED=(EC_DVDBASE+21);
varEC_DVD_CMD_START=(EC_DVDBASE+22);//notusedbyMSWebDVD
varEC_DVD_CMD_END=(EC_DVDBASE+23);//notusedbyMSWebDVD
varEC_DVD_DISC_EJECTED=(EC_DVDBASE+24);
varEC_DVD_DISC_INSERTED=(EC_DVDBASE+25);
varEC_DVD_CURRENT_HMSF_TIME=(EC_DVDBASE+26);
varEC_DVD_KARAOKE_MODE=(EC_DVDBASE+27);
varnCurDomain;
varnCurParentalLevel;
functionProcessDVDEvent(EventCode,Param1,Param2)
{
switch(EventCode)
{
caseEC_DVD_DOMAIN_CHANGE:
nCurDomain=Param1;
//dosomething
break;
caseEC_DVD_PARENTAL_LEVEL_CHANGE:
nCurParentalLevel=Param1;
//dosomething
break;
//handleanyothereventsyouareinterestedin
default:
break;
}
}
</SCRIPT>
处理用户的事件通告
当特定的用户操作被允许或者被禁止的时候,MSWebDVD对象发送一个uop通报信息给应用程序。每个用户操作都有自己的事件,但它们都是一个Boolean量,仅仅用来标识操作现在被允许或者被禁止。
对于每个你希望处理的事件,指定的事件处理者展示了一些代码,读者可以参阅。
<SCRIPTLANGUAGE="JScript"FOR=DVDEVENT="PlayForwards(bEnabled)">
PlayForwardsEventHandler(bEnabled)
</SCRIPT>
Nowdefineyourhandlermethodtorespondappropriatelytotheevent.Assumethatthe"button_Play"variablehereistheidattributeofthe"Play"buttoninyourapplication.
functionPlayForwardsEventHander(bEnabled)
{
if(bEnabled==true)
button_Play.disabled=false;
else
button_Play.disabled=true;
}
同步满足html要求的视频
通过处理碟片的事件编码事件,一个web应用程序就可以同步满足html的视频了。例如,你可以使图像和文字在这个页面视频上的指定点进行变化。下面的代码展示了一种通过时间编码事件来同步jscipt函数的调用。
//DVDTriggerPointsarrayholdsframecountforeachtrigger.Mustbeinascendingorder.
//Usetimecode2frames()toconverttimecodes(hh:mm:ss:ff)tototalnumberofframes.
varDVDTriggerPoints=newArray(
timecode2frames("01:15:24:00"),
timecode2frames("01:23:02:00"));
//DVDTriggerProcsarrayholdsfunctionstobecalledateachtriggerpointdefinedinDVDTimePoints.
varDVDTriggerProcs=newArray(
"showDogPic();",
"showCatPic();");
//DVDTriggerIndexkeepstrackofcurrenttrigger(itindexesDVDTriggerPointsandDVDTriggerProcs).
varDVDTriggerIndex=0;
//HandleDVDEvents
functionProcessDVDEvent(EventCode,Param1,Param2){
switch(EventCode){
caseEC_DVD_CURRENT_HMSF_TIME:
if(MSWebDVD.CurrentDomain==4){//Don'tbothercheckingunlessdiscisplaying.
if(DVDTriggerIndex<DVDTimePoints.length){//Aretheretriggerpointslefttocheck?
currentDVDTime=(MSWebDVD.DVDTimeCode2bstr(Param1));
if(timecode2frames(currentDVDTime)>=DVDTriggerPoints[DVDTimeIndex]){
//iftriggerpointhaspassed,executetheassociatedfunction
eval(DVDTriggerProcs[DVDTimeIndex++]);
}
}
}
break;
//handleotherevents
}
}
functiontimecode2frames(timeCode){
if(timeCode!="undefined"){
returntimeCode.substring(0,2)*108000
+timeCode.substring(3,5)*1800
+timeCode.substring(6,8)*30
+timeCode.substring(9,11);
}else{
return0;
}
}
用LCIDs进行工作
LCID,或者可以叫做“localeidentifer”,它是一个32位的数据类型,它是为了帮助我们鉴定不同的地区区码语言。这些值的其中一项就是“主语言标识”,这可以用来鉴定基本的区域语言。例如,英语,西班牙语等。
MSWebDVD要求一个完整有效的LCID作为下面两种方法的输入参数:SelectDefaultAudioLanguage和SelectDefaultSubpictureLanguage。这些可以是任何可被Windows识别的有效LCID,甚至也可以不被Windows识别。(主机不必一定支持本地机的字体、键盘映射等)下面列表写出了一些通用LCIDs以及Windows默认态不识别但对MSWebDVD有效的非通用LCIDs。该表不是完整的LCIDs列表。
一些有效的LCIDs
Afrikaans0x0436Albanian0x041cArabic(Algeria)0x1401
Arabic(Bahrain)0x3c01Arabic(Egypt)0x0c01Arabic(Iraq)0x0801
Arabic(Jordan)0x2c01Arabic(Kuwait)0x3401Arabic(Lebanon)0x3001
Arabic(Libya)0x1001Arabic(Morocco)0x1801Arabic(Oman)0x2001
Arabic(Qatar)0x4001Arabic(SaudiArabia)0x0401Arabic(Syria)0x2801
Arabic(Tunisia)0x1c01Arabic(U.A.E.)0x3801Arabic(Yemen)0x2401
Basque0x042dBelarusian0x0423Bulgarian0x0402
Catalan0x0403Chinese(HongKong)0x0c04Chinese(PRC)0x0804
Chinese(Singapore)0x1004Chinese(Taiwan)0x0404Croatian0x041a
Czech0x0405Danish0x0406Dutch(Belgian)0x0813
Dutch(Standard)0x0413English(Australian)0x0c09English(Belize)0x2809
English(Canadian)0x1009English(Caribbean)0x2409English(Ireland)0x1809
English(Jamaica)0x2009English(NewZealand)0x1409English(SouthAfrica)0x1c09
English(Trinidad)0x2c09English(UnitedKingdom)0x0809English(UnitedStates)0x0409
Estonian0x0425Faeroese0x0438Farsi0x0429
Finnish0x040bFrench(Belgian)0x080cFrench(Canadian)0x0c0c
French(Luxembourg)0x140cFrench(Standard)0x040cFrench(Swiss)0x100c
German(Austrian)0x0c07German(Liechtenstein)0x1407German(Luxembourg)0x1007
German(Standard)0x0407German(Swiss)0x0807Greek0x0408
Hebrew0x040dHungarian0x040eIcelandic0x040f
Indonesian0x0421Italian(Standard)0x0410Italian(Swiss)0x0810
Japanese0x0411Korean0x0412Korean(Johab)0x0812
Latvian0x0426Lithuanian0x0427Malay(Malaysian)0x043e
Malay(Brunei)0x083eNorwegian(Bokmal)0x0414Norwegian(Nynorsk)0x0814
Polish0x0415Portuguese(Brazilian)0x0416Portuguese(Standard)0x0816
Romanian0x0418Russian0x0419Serbian(Cyrillic)0x0c1a
Serbian(Latin)0x081aSlovak0x041bSlovenian0x0424
Spanish(Argentina)0x2c0aSpanish(Bolivia)0x400aSpanish(Chile)0x340a
Spanish(Colombia)0x240aSpanish(CostaRica)0x140aSpanish(DominicanRepublic)0x1c0a
Spanish(Ecuador)0x300aSpanish(ElSalvador)0x440aSpanish(Guatemala)0x100a
Spanish(Honduras)0x480aSpanish(Mexican)0x080aSpanish(ModernSort)0x0c0a
Spanish(Nicaragua)0x4c0aSpanish(Panama)0x180aSpanish(Paraguay)0x3c0a
Spanish(Peru)0x280aSpanish(PuertoRico)0x500aSpanish(TraditionalSort)0x040a
Spanish(Uruguay)0x380aSpanish(Venezuela)0x200aSwahili0x0441
Swedish0x041dSwedish(Finland)0x081dThai0x041e
Turkish0x041fUkrainian0x0422
一些MSWebDVD方法和属性返回的LCID可以指定那一个标识在音轨或者字幕上是有效的。为了使用这个信息,你的应用程序将需要从返回LCID中选择主语言标识。为了达到这个目的,我们可以将iLCID和0x3ff进行按位的与操作。以下代码摘录的演示了这种实现过程。(主语言标识中包含了LCID中的至少10位标记)
iPrimaryLang=iLCID&0x3FF;
为了从主语言标识中获得人们可读的字符串,调用GetLangFromLangID,代码如下:
sLanguage=DVD.GetLangFromLangID(iPrimaryLang);
下面的列表展示了LCID中的主语言标识。
SomeValidPrimaryLanguageIDs
Afrikaans0x36Albanian0x1cArabic0x01Basque0x2d
Belarusian0x23Bulgarian0x02Catalan0x03Chinese0x04
Croatian0x1aCzech0x05Danish0x06Dutch0x13
English0x09Estonian0x25Faeroese0x38Farsi0x29
Finnish0x0bFrench0x0cGerman0x07Greek0x08
Hebrew0x0dHungarian0x0eIcelandic0x0fIndonesian0x21
Italian0x10Japanese0x11Korean0x12Latvian0x26
Lithuanian0x27Malay0x3eNorwegian0x14Polish0x15
Portuguese0x16Romanian0x18Russian0x19Serbian0x1a
Slovak0x1bSlovenian0x24Spanish0x0aSwahili0x41
Swedish0x1dThai0x1eTurkish0x1fUkrainian0x22
播放卡拉ok碟片
卡拉ok碟片是dvd视频碟片的一种,它有着和dvd视频碟片相同的导航结构。歌曲是按照一般节的格式存放的,节可以合成一个章,它是基本的播放单位。
对于卡拉ok碟片和普通dvd碟片的最大不同点就是音频流的区别。卡拉ok碟片是包含了所有的多通道音频,通常是DolbyAC-3。通道0和1一般包括背景音效,2到5通道包含了嗓音,合成等音频。一个卡拉ok应用程序可以控制音量和目的喇叭,可以控制混音声道。
卡拉ok的回放要求一个音频解码器,要求支持多通道的卡拉ok混音信息的解码器。解码器必需支持dvd卡拉ok属性设置(AM_PROPERTY_DVDKARAOKE)。
当DVD导航在碟片上检测到卡拉ok的内容的时候,它会自动进入卡拉ok模式,然后通知解码器上面的三个混音通道那个应该静音,直到它们被应用程序打开。
1.决定它们的内容和混音通道数。
2.提供一个用户接口显示通道的内容,允许用户可以在任何时间进行混音通道的开关。
Dvd的文字
Dvd碟片,尤其是卡拉ok碟片,可能包含了一个文字信息的数据库来补充视频和音频的内容。象这样的文字,在卡拉ok碟片上有可能会包括歌曲的标题,艺术名,记录标签等等内容。这些文字可以被翻译成不同的语言。这些字符串是可选择的,碟片上不要求必需含有它们。现在它们的组织结构是通过dvd卷标的逻辑层次的近似镜像的方法实现。
有两种基本类型的字符串:结构标识和内容标识。这些类型用0x01到0x20的值是结构标识。它们是空的字符串,数字码被用来标识逻辑结构,表示内容字符串是属于那个逻辑结构的。这个结构非常符合dvd碟片内容的逻辑结构:卷标,标题,章节等等。剩下的内容标识是被用来显示到用户界面信息的字符串。
历史上,DVD碟片上的文本串在是唯一的,这些碟片大多使用0x01和0x02结构标示符以及0x30类型内容字符串。但现在却不是如此(1)越来越多类型的DVD-Video碟片包含文本串(2)为了提供对碟片内容的详尽描述这些串以更加复杂的方式组织。下例代码演示如何决定碟片上文本串语言块的数目以及检索让用户设置语言的可读串。代码中,串被添加于"TextLanguageList"HTMLSELECT元素代码。
functionGetTextLanguages()
{
//getthenumberoftextblocks
varnumLangs=DVD.GetDVDTextNumberOfLanguages();
variLCID;
variPrimaryLang;
varsLanguage;
varoOption;
for(j=0;j<numLangs;j++)
{
//getthelocaleidentifierforthelanguageblock
iLCID=DVD.GetDVDTextLanguageLCID(j);
//gettheprimarylanguageIDfromtheLCID
iPrimaryLang=iLCID&0x3FF;
//getthehuman-readablestringfromtheprimarylanguageID
sLanguage=DVD.GetLangFromLangID(iPrimaryLang);
//addittotheSELECTelementontheHTMLpage
oOption=document.createElement("OPTION");
oOption.text=sLanguage;
document.all.TextLanguageList.add(oOption);
}
}//endfunctionGetTextStrings
下列检测代码演示如何枚举串和检查文本串类型。结果在名为"myTextArea"的HTMLTEXTAREA元素中,故可以看到数字串类型如何被用于组织内容串。实程序会创建自己的数据结构来包含串或以向用户显示串。
//iLanguageisthe0-basedindexforthelanguageblock
functionGetTextStrings(iLanguage)
{
varnumStrings,stringType,j;
numStrings=DVD.GetDVDTextNumberOfStrings(iLanguage);
for(j=0;j<numStrings;j++)
{
stringType=DVD.GetDVDTextStringType(iLanguage,j);
if(stringType>0x20)//thereisactuallysometexttoreadhere
{
myTextArea.value+=(stringType+":"+DVD.GetDVDTextString(iLanguage,j)+"n");
}
else//It´sanodeindicatingwhatlevelofthevolumestructure
//thefollowingstringswillapplyto
{
myTextArea.value+=(stringType+"n");
}
}
}//endfunctionGetTextStrings
dvd文本字符串类型
这个表格列出了dvd文本字符串类型的子集。在0x20以下的字符串都是内容字符串。大部分的歌曲名称和标题都是0x30。
结构标示符
Volume0x01指示串属于DVD卷
Title0x02标题
ParentalID0x03指示串属于特定父ID.
Chapter0x04指示串属于章
Cell0x05指示串属于单元(电影的一个场景)
流标示符
Audio0x10指示串属于音频流
Subpicture0x11指示串属于子图流
Angle0x12指示串属于角块
音频通道标示符
Channel0x20指示串属于音频留的一个通道
通用内容串
Name0x30标题名、章名、歌曲名的通用标示符
Comments0x31标题、章、歌曲的通用内容
标题内容串
Series0x38标题、章、歌曲的附信息
Movie0x39电影的标题或章的附加信息
Video0x3a视频的标题或章的附加信息
Album0x3b相册的标题或章的附加信息
Song0x3c歌曲的标题或章的附加信息
Other0x3f其它的标题或章的附加信息
第二标题内容串
Series0x40标题、章、歌曲的附加信息
Movie0x41电影的标题或章的附加信息
Video0x42视频的标题或章的附加信息
Album0x43相册的标题或章的附加信息
Song0x44歌曲的标题或章的附加信息.
Other0x45其它的标题或章的附加信息
原始内容串
Series0x48标题、章、歌曲的附加信息
Movie0x49电影的标题或章的附加信息
Video0x4a视频的标题或章的附加信息
Album0x4b相册的标题或章的附加信息
Song0x4c歌曲的标题或章的附加信息.
Other0x4f其它的标题或章的附加信息
其它信息内容串
OtherScene0x50电影标题或章可选场景的附加信息
OtherCut0x51电影标题或章可选剪辑的附加信息
OtherTake0x52电影标题或章可选画面的附加信息