如何在RF64 WAV文件中写入Cue数据?
提问(中文翻译)
我不确定StackOverflow是否是该问题的合适平台,但遍历StackExchange网络后未找到更合适的站点,若问题不符合要求深表歉意。我正在开发一个基础WAV文件写入器,除播放所需常规元数据外,需在任意位置添加Cue标记,但处理4GB以上文件时遇到问题。我了解大WAV文件的多种实现方案,希望采用RF64格式,但Cue结构体使用32位采样位置偏移,限制Cue标记只能在约40亿采样点之前添加,无法标记之后的位置。
编辑1:我混淆了采样偏移与数据,Cue块用采样偏移定位标记,多通道文件中可能无需修改即可用于4GB以上文件,但采样点超过40亿时问题仍存在。我知道这一阈值很高,但不想不必要地限制音频长度。
编辑2:通过Adobe Audition 6测试大WAV文件发现,Audition通过生成.xmp文件绕过该限制,但我仍希望尽可能在单个文件内采用标准方式实现Cue标记。请问该如何实现?
针对RF64格式下Cue块32位采样偏移的限制,以下是几种单文件、标准合规的实现方式:
1. 扩展RF64的Cue块为64位版本
RF64作为EBU制定的大WAV标准,允许自定义扩展块兼容大尺寸数据。你可以定义一个cue64块,替换原有的32位dwSampleOffset为64位的qwSampleOffset字段,并在ds64块中注册这个新块类型,确保兼容软件能识别。
具体操作:
- 在
ds64块的块计数列表中添加cue64条目,记录其64位大小 - 设计
cue64块结构:保留原Cue块的dwCuePoints、每个标记的dwName等字段,仅将采样偏移字段改为64位无符号整数 - 写入文件时,可选择只保留
cue64块,或同时保留cue块(供不支持扩展的旧软件降级兼容)
2. 利用LIST块存储标记元数据
WAV原生支持的LIST块(通常为INFO类型)可存储文本格式的标记信息。你可以将采样点位置转换为基于采样率的时间码,存入MARK标签或自定义标签中,无需修改核心Cue块结构,兼容性更广。
示例结构:
LIST (INFO) MARK "03:45:12.345" ; 对应采样点 = 总毫秒数 × 采样率 ÷ 1000 MARK "07:10:00.000" ; 第二个标记点
3. 结合WAVEFORMATEXTENSIBLE扩展Cue结构
如果你的音频采用WAVEFORMATEXTENSIBLE格式,可以在格式块的扩展数据中声明对64位Cue偏移的支持,同时修改Cue块的偏移字段为64位。这种方式需要确保格式块的cbSize字段正确设置,扩展数据中明确标注支持64位采样偏移。
注意事项
- 无论采用哪种方案,都必须保证
ds64块准确记录所有块的64位大小,这是RF64支持大文件的核心 - 完成实现后,优先在专业音频软件(如Audition、Pro Tools)中测试兼容性,确保标记能被正确读取和定位
内容的提问来源于stack exchange,提问作者Mr. Tea

