menu
版本
2017.1.9.6501
2024.1.5.8803
2023.1.13.8732
2022.1.19.8584
2021.1.14.8108
2019.2.15.7667
2019.1.11.7296
2018.1.11.6987
2017.2.10.6745
2017.1.9.6501
2016.2.6.6153
2015.1.9.5624
2024.1.5.8803
2023.1.13.8732
2022.1.19.8584
2021.1.14.8108
2019.2.15.7667
2019.1.11.7296
2018.1.11.6987
2017.2.10.6745
2017.1.9.6501
2016.2.6.6153
2015.1.9.5624
Marker(标记)是插入 WAV 文件并用在波形中标示位置的标识符。通常可以在 WAV 编辑器应用程序(例如 SoundForge®、Adobe® Audition® 或 CueTool)中创建这些标记。
当播放到特定位置时,应用程序可使用这些标记来获得通知。例如,您可以使用此信息将视觉内容的绘制与正在播放的音频同步,或者了解随机容器正在播放哪个文件,以便在游戏中显示正确的字幕。
info
|
Note: 使用 Wwise 标记通知(Marker Notification)功能通常是集成对口型或字幕解决方案最高效的方式。 |
块(chunk)是用于存储提示点(cue point)或有关提示点的数据的数据存储单元。提示点是 .wav 格式文件中标示的兴趣点。
提示块(cue chunk)格式用于存储标记位置,标记位置用于提示 .wav 文件中的兴趣点。
偏移量 字节 说明 值
0x00 4 块 ID "cue " (0x63756520)
0x04 4 块数据大小 取决于提示点数量
0x08 4 提示点数量 列中提示点的数量
0x0c 提示点从此开始
#define CueID 'cue ' /* 提示块的块 ID*/ typedef struct { ID chunkID; long chunkSize; long dwCuePoints; CuePoint points[]; } CueChunk; typedef struct { long dwIdentifier; long dwPosition; ID fccChunk; long dwChunkStart; long dwBlockStart; long dwSampleOffset; } CuePoint;
列表块(list chunk)是包 .wav 文件内部的容器,其中包含子块。相关数据列表块(associated data list chunk,adtl)格式用于存储标签、注释以及与提示点的关联文本。
偏移量 字节 说明 值 0x00 4 块 ID "list" (0x6C696E74) 0x04 4 块数据大小 取决于包含的子块 0x08 4 类型 ID "adtl" (0x6164746C) 0x0c 子块从此开始
标签子块(label sub-chunk)格式用于存储提示点的关联字符串。它应该位于关联数据列表块内。
偏移量 字节 说明 值
0x00 4 块 ID "labl" (0x6C61626C)
0x04 4 块数据大小 取决于文本大小
0x08 4 提示点 ID 参阅提示块 dwIdentifier
0x0c 标签(大小可变的文本)
以下是有关如何设置应用程序,以使它能够接收标记通知的说明:
AK_Marker
标识添加到 in_uiFlags
。如果您还想收到End of Event(事件结束)通知,则应使用 AK_EndOfEvent
| AK_Marker
,因为这些标志采取按位异或运算。AkPlayingID AK::SoundEngine::PostEvent( AkUniqueID in_eventID, // 唯一的事件 ID AkGameObjectID in_gameObjectID, // 相关游戏对象 ID AkUInt32 in_uFlags = 0, // 位掩码:见 AkCallbackType AkCallbackFunc in_pfnCallback = NULL, // 回调函数 void * in_pCookie = NULL // 回调的 cookie 将与其他信息一起 // 发送到回调函数 );
static void MarkersCallback( AkCallbackType in_eType, // 回调原因的类型,在本例中,类型为接收到 // 标记事件时的 AK_Marker。 AkCallbackInfo* in_pCallbackInfo // 指向回调信息结构的指针,在本例中为 // AkMarkerCallbackInfo*。 )
AK_Marker
通知,则在收到任何其他事件类型时应返回。in_pCallbackInfo
类型转换(typecast)为相应的信息结构类型。对于 AK_Marker 通知,相应的信息结构类型为 AkMarkerCallbackInfo。// 对应于 AK_Marker 的回调信息结构。 struct AkMarkerCallbackInfo : public AkEventCallbackInfo { AkUInt32 uIdentifier; // 提示点标识符 AkUInt32 uPosition; // 提示点中的位置(单位:采样帧) const char * strLabel; // 标记的标签,从文件中读取 };
strLabel
字符串成员的内容,因为在回调返回后,指针可能会被作废。目前当缓冲区向下传递到硬件时发送通知。这意味着,发送通知与遇到标记之间存在一定延时。这样在真正播放与标记关联的声音之前,应用程序有足够的时间来收集并处理标记中的信息。
注意这个延时取决于平台。
Marker 回调和 End of Event 回调从声音引擎的主线程完成。这意味着您的应用程序应从通知中收集它所需的全部信息,并立即返回。如果需要进行任何处理,则应当从通知中复制相关信息后,使用单独的线程来执行。
如果应用程序占用线程太久,声音引擎可能掉入 underrun(欠载运行)状态,导致输出停止播放。
Wwise Profiler 可以显示来自声音引擎的标记通知。为此,必须确保启用 Profiler Settings 对话框中的 Markers Notification Data 选项。当播放到达标记处并已请求通知时,Capture Log 中将在新的一行中显示相关信息。注意,如果需要可以过滤掉这些通知,方法是取消选择 Capture Log Filter 对话框中的 Markers Notification Data 复选框。