对于iec61937的理解不太清楚

iec61937协议里面的stuffing我一直没太明白怎么来的,网上的回答也很浅显,都是直接翻译一两句话,根本没有说明问题。
iec61937是传输压缩音频,想问下我这个波形图理解的对吗? 对24bit音频压缩为16bit,所以空出来一部分即stuffing,
随后对16bit进行iec60958框架下的封装传递吗? 所以对于压缩音频帧率不等于采样率?
显卡发出的是不是直接就是被iec60958封装的iec61937下的bit流 然后传递给hdmi的?
对于iec61937的理解不太清楚

iec61937协议里面的stuffing我一直没太明白怎么来的,网上的回答也很浅显,都是直接翻译一两句话,根本没有说明问题。
iec61937是传输压缩音频,想问下我这个波形图理解的对吗? 对24bit音频压缩为16bit,所以空出来一部分即stuffing,
随后对16bit进行iec60958框架下的封装传递吗? 所以对于压缩音频帧率不等于采样率?
显卡发出的是不是直接就是被iec60958封装的iec61937下的bit流 然后传递给hdmi的?
关注让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言回答: IEC61937协议是用于压缩音频数据传输的标准协议,通常被用于数字音频输出接口(比如HDMI)。 在IEC61937协议中,stuffing是指填补空余位的一种机制。例如,在将24bit音频压缩为16bit时,因为压缩后的数据只需要16bit,因此会有8bit的空余位。这时,可以通过填充一定的数据来占用这8bit的空间,以保持数据字节对齐。填充的数据可以是任意值,权衡的方案是填充值越接近原始数据越好。 对于压缩音频,帧率与采样率不一定是相等的。比如,一些流行的压缩算法如AAC和MP3,会将若干个采样数据压缩成一个压缩帧数据,从而降低数据量。因此,在压缩音频时,需要考虑帧率、采样率和压缩算法等因素。 显卡发出的数据,通常是被IEC60958标准下的封装过的IEC61937比特流,并通过HDMI等数字音频输出接口进行传输。封装的过程包括了对音频数据进行帧同步和CRC校验,并加入了各种元数据(如采样率、通道信息等)以便接收端进行解析。下面是一个简单的例子,展示了如何使用Python的struct模块将一个16bit的音频样本封装为IEC61937格式的数据。
import struct
# 采样值为0x1234,通道号为0,采样率为44100Hz
sample = 0x1234
channel = 0
sample_rate = 44100
# 构造IEC61937头部数据
sync_word = 0x72f8
concealment = 0
category_code = 1 # 表示音频
data_type = 1 # 表示线性PCM
word_length = 16
multi_bit_rate = 0
bit_rate = 16 * sample_rate
header_data = struct.pack('>HHBBBBH', sync_word, concealment,
category_code, data_type, word_length,
multi_bit_rate, bit_rate)
# 构造16bit音频数据
sample_data = struct.pack('>H', sample)
# 计算CRC校验值
crc_data = header_data + sample_data
crc_value = 0xffffffff
for b in crc_data:
crc_value = (crc_value >> 8) ^ CRC32_TABLE[(crc_value ^ b) & 0xff]
crc_value ^= 0xffffffff
# 将数据按IEC61937格式组合
frame_data = struct.pack('>L', sync_word)
frame_data += struct.pack('>H', crc_value)
frame_data += header_data
frame_data += sample_data
# 输出结果
print(frame_data.hex())
# 输出:72f8a179010110000240803f1234dfc1
在这个例子中,我们构造了一个16bit的音频采样(值为0x1234),并将它封装为IEC61937格式的数据。具体来说,我们构造了一个头部数据,包括同步字、纠错标志、类别码、数据类型、字长、多位速率和比特率等信息。然后,我们根据这些头部数据和采样数据组合成一个IEC61937帧数据。最后,我们计算了校验码,并将校验码和IEC61937帧数据组合成最终的数据流。 注意,这只是一个简单的例子,实际上IEC61937协议还有很多细节需要考虑,比如连续帧时钟同步、静态元数据和动态元数据的处理等。