将 FLAC 通道分配更改为去相关的左侧会导致丢失同步错误状态

Changing FLAC channel assignment to decorrelated left-side causes lost sync error status

我已经根据规格 here 创建了一个最小的立体声 FLAC 文件。它是一个包含 8192 个 0 样本的单块,编码为常量:

00000000: 664c 6143 8000 0022 2000 2000 0000 0000
00000010: 0000 0ac4 42f0 0000 0000 bb7d f04e 1b0a
00000020: 2570 6575 27a7 e108 ae23 fff8 d918 0060
00000030: 0000 0000 0000 119a

如果我 运行 flac -t stereo_file.flac,此文件被检查为“正常”。根据上面的链接规范,0x2D字节0x18的高4位表示声道分配0001,即左右声道。如果我将那个 nybble 更改为 8,用于通道分配 1000,或左右去相关通道(并调整 0x2F 处的 CRC8 和 0x36 处的 CRC16) ,我得到以下文件:

00000000: 664c 6143 8000 0022 2000 2000 0000 0000
00000010: 0000 0ac4 42f0 0000 0000 bb7d f04e 1b0a
00000020: 2570 6575 27a7 e108 ae23 fff8 d988 0081
00000030: 0000 0000 0000 a880

除了这次,当我运行上面的flac命令时,它报告:

stereo_file.flac: *** Got error code 0:FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC
*** Got error code 0:FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC


stereo_file.flac: ERROR during decoding
           state = FLAC__STREAM_DECODER_END_OF_STREAM

我看不出为什么这会报错,除非在有关去相关的规范中没有提到某种细微差别或警告。有什么方法可以更详细地说明导致第二个文件出现此错误的原因,以及如何修复它?

虽然左声道、右声道和中声道是 16 位,但侧声道需要是 17 位,否则侧声道可能会剪辑或溢出。

比如在流中的某个点,左声道为32767(使用有符号16位时的最大正整数),右声道为-32768(最大负整数)时的结果使用左侧将是-65535的侧面样本,必须至少存储17位。

我同意这是 FLAC 规范中没有明确提及的内容。另见 this code on github