很爱吃烤饼 2024-03-29 15:18 采纳率: 37.5%
浏览 20
已结题

iec61937 问题

对于iec61937的理解不太清楚

img

iec61937协议里面的stuffing我一直没太明白怎么来的,网上的回答也很浅显,都是直接翻译一两句话,根本没有说明问题。

iec61937是传输压缩音频,想问下我这个波形图理解的对吗? 对24bit音频压缩为16bit,所以空出来一部分即stuffing,

随后对16bit进行iec60958框架下的封装传递吗? 所以对于压缩音频帧率不等于采样率?

显卡发出的是不是直接就是被iec60958封装的iec61937下的bit流 然后传递给hdmi的?

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-29 15:18
    关注
    让阿豪来帮你解答,本回答参考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协议还有很多细节需要考虑,比如连续帧时钟同步、静态元数据和动态元数据的处理等。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月31日
  • 已采纳回答 7月23日
  • 创建了问题 3月29日