将 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。
我已经根据规格 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。