天神十三煞 发表于 2009-10-18 21:31

蓝光导航命令

本帖最后由 天神十三煞 于 2014-1-20 08:21 编辑

如果你有一定编程经验,本文非常简单易懂
如果没有,请问搜索引擎,查询这些关键字

Navigations Commands
导航命令,类似汇编语言,一般从上到下顺序执行,使用goto来实现结构嵌套
储存于MovieObject或MenuButton中,用于完成一些目的程序操作而实现用户与BD媒体的交互
两者所支持命令项略有不同,但大部分内容相同,未列出不同的命令较简单或者基本不会用到

预载型:命令触发器是Movie Object本身,即进入此movieObject就开始顺序执行其导航命令
临时型:命令触发器是Menu Button激活,用户激活该菜单按钮时顺序执行该按钮里储存的导航命令

使用BDedit可以看到此类命令,并有十六进制值可参考
打开Scenarist BD可以看到此类命令,有视图命令编辑框

天神十三煞 发表于 2009-10-18 21:32

本帖最后由 天神十三煞 于 2014-1-20 08:19 编辑

命令后面的操作值[或序号]可以是IMM,也可以来自PSR或GPR
IMM、PSR、GPR这些缩写常见于各类BD编辑软件,含义如下

IMM: Immediate value
表示直接赋值,数值为指定的常数

PSR: Player Status Registers
播放器状态值专用寄存器,不可被用户赋值
总共已有30个不同的PSR,用来标示播放器当前状态
例如PSR1储存的值是当前主音轨序号
又例PSR2储存的值是当前字幕[含PIP的]轨序号和开启状态
部分PSR的值为播放器自动预设,另外的则是根据命令操作而变化

GPR: General Purpose Registers
通用寄存器,可以被用户赋值
总共允许添加4096个GPR,GPR里的值通常直接或间接受命令操作而变化
一般来说GPR是用来储存用户的变量值以实现某些操作目的(注:倒数5个已被系统使用)
如果是完全新建[无任何movieObject或menu]项目添加GPR寄存器时可按正序从0开始
如果是修改既存命令时想添加寄存器,不知道已用多少个GPR,建议从4090倒序开始

Nop
空白命令项,一般用来配合goto分离命令的嵌套

GoTo
转到指定的命令行

Break
中断并退出当前命令

JumpObject
跳转到指定的MovieObject

JumpTitle
跳转到指定的Title

CallObject
停止当前播放内容并跳转到指定的MovieObject

CallTitle
停止当前播放内容并跳转到指定的Title

Resume
恢复之前停止的播放内容

Play PL
播放指定playlist

Play PL_PI
从指定playlist的某playitem开始播放

Play PL_MK
从指定playlist的某playlistmark开始播放

TerminatePL
从当前列表播放内容退出

Link PI
转到指定PlayItem

Link MK
转到指定PlayListMark

BC 或 If &
把某GPR或PSR内的值和某值进行二进制比较,结果为真则……

EQ 或 If ==
如果某GPR或PSR内的值和某值相等就进行以下操作……

NE 或 If !=
如果某GPR或PSR内的值和某值不等就进行以下操作……

GE 或 If >=
如果某GPR或PSR内的值大于等于某值就进行以下操作……

GT 或 If >
如果某GPR或PSR内的值大于某值就进行以下操作……

LE 或 If <=
如果某GPR或PSR内的值小于等于某值就进行以下操作……

LT 或 If <
如果某GPR或PSR内的值小于某值就进行以下操作……

Move
将某值[或另个GPR内的值]赋值给目标GPR

Swap
交换两个GPR内的值

Add
把目标GPR内的值增加某值并储存到这个GPR内

Sub
把目标GPR内的值减少某值并储存到这个GPR内

Mul
把目标GPR内的值乘以几倍并储存到这个GPR内

Div
把目标GPR内的值缩小几倍并储存到这个GPR内

Mod
把目标GPR内的值除以某个值,然后将获得的余数再储存进这个GPR

Rnd
从某范围内随机一个值赋值给目标GPR

And
将目标GPR内的值和某数进行与运算得结果并储存进这个GPR

Or
将目标GPR内的值和某数进行或运算得结果并储存进这个GPR

Xor
将目标GPR内的值和某数进行异或运算得结果并储存进这个GPR

BitSet
将目标GPR内的值[二进制的]第某位赋为1

BitClear
将目标GPR内的值[二进制的]第某位赋为0

ShiftLeft
将目标GPR内的值[二进制的]左移几位

ShiftRight
将目标GPR内的值[二进制的]右移几位

SetStream
更改音频、字幕、角度、或菜单的轨位为指定序号

SetNVTimer
当某时长[秒]后跳转到目标MovieObject

SetSecondaryStream
更改副视频、副音频或其字幕的轨位为指定序号

天神十三煞 发表于 2014-1-21 00:20

范例之一
0. EQ GPR0, 0
1. GoTo 6
2. Move GPR5, GPR0
3. Sub GPR5, 1
4. Play PL_MK 1, GPR5
5. GoTo 8
6. NOP
7. Play PL 1
8. NOP
9. Jump Title 2

翻译解释
0. 如果GPR0的值等于0则执行下一行,否则执行再下一行
1. 转到第6行命令开始执行
2. 将GPR0的值赋给GPR5
3. 将GPR5里的值减去1,并储存到GPR5
4. 播放1号Playlist的某章节,此章节序号值来自GPR5
5. 转到第8行命令开始执行
6. 空
7. 播放1号Playlist
8. 空
9. 跳转到第2号Title

直观程序
if (gpr0 == 0)
{
    play (Playlist 1)
    Jump Title 2
}
else
{
    gpr5=gpr0
    gpr5=gpr5-1
    play (Playlist 1, playlistmark gpr5)
    Jump Title 2
}

结果样本
例如GPR0的值是0,那么播放mpls1[默认从0号章节开始],播完后跳到title2
例如GPR0的值是3,那么把这3-1=2储存进GPR5,再播放mpls1的2号章节,播完后跳到title2
一般来讲这个GPR0的值可能是playlist1的弹出菜单选章节后读取了章节所在PSR的值并储入GPR0
由于执行序号为0起,所以上面有个减1的操作,通过上述命令可以最终实现恢复播放上次的章节

                        
范例之二
0. NOP
1. Move GPR5, 2
2. NOP
3. EQ GPR4, 1
4. SetStream 1, 2, (0), (0)
5. EQ GPR4, 2
6. SetStream 2, 2, (0), (0)
7. EQ GPR4, 3
8. SetStream 3, 2, (0), (0)
9. SetButtonPage 5, (1)

翻译解释
0. 空
1. 将GPR5内的值赋为2
2. 空
3. 如果GPR4内的值等于1则执行下一行,否则执行再下一行
4. 将音频设置为第1轨、字幕第2轨
5. 如果GPR4内的值等于2则执行下一行,否则执行再下一行
6. 将音频设置为第2轨、字幕第2轨
7. 如果GPR4内的值等于3则执行下一行
8. 将音频设置为第3轨、字幕第2轨
9. 菜单光标转到按钮5

直观程序
gpr5=2
if (gpr4 == 1){setstream(Au1,PG2) }
if (gpr4 == 2){setstream(Au2,PG2) }
if (gpr4 == 3){setstream(Au3,PG2) }
setButtonPage(5)

结果样本
这是一个有三条音轨和两条字幕的菜单的导航命令,该按钮的作用是设置为第二轨字幕并保持音轨不变
GPR5用来存当前按钮设置后字幕轨的序号,而GPR4里存的则是上一次音轨设置按钮的设置后的音轨序号
首先将GPR5值储存为2[当前要设置的字幕轨],之后这个值可以在音轨设置按钮用来判断该保留的字幕轨
然后读取GPR4里的值,分别设置为三种情况,需要这么做的原因是setstream不可单独设置音频或字幕轨

enjoien 发表于 2014-1-21 00:36

计算机语言门外汉路过,赶脚有点像中学时代的basic语言。

weigui01 发表于 2014-12-13 11:06

好高森啊,看不懂

niohy 发表于 2015-1-12 11:34

赞的,学习!感谢大神

mathmath 发表于 2015-8-5 19:16

这篇务必研习,一切的基础。太赞的文章!
想后期重建系统,重建菜单,修复不能播放的原盘,破解区码,一切的一切,都从这篇开始。
页: [1]
查看完整版本: 蓝光导航命令