【问题标题】:What does "hip: Can't rewind stream by 74 bits", outputted by mpglib, really means?mpglib 输出的“hip: Can't rewind stream by 74 bits”到底是什么意思?
【发布时间】:2023-04-07 18:12:01
【问题描述】:

我在使用mpglib 使用libmp3lame 库环境解码MP3 数据时收到几条错误消息。

错误(#1): hip: 无法将流倒带 74 位!
error(#2): hip: 比特流问题,重新同步跳过 10 个字节...

注意:“重新同步”消息表示 10 个字节,即 74 位四舍五入:(74 + 7) / 8 = 10

我的 MP3 解码器代码遵循 LAME 前端工具中的代码(主要是 frontend/lame_main.cfrontend/get_audio.c)。

标头不会产生错误,并且我根据前端工具最多使用 100 个字节(请参阅 get_audio.c 文件中的 lame_decode_initfile() 函数。)我什至尝试在处理标头时一次读取一个字节的数据看看它是否会有所作为......不是真的。

当我在解析标题后开始传递 MP3 数据时发生错误。

知道为什么我会收到这些错误消息吗?

附:当我使用蹩脚的命令行工具解码时,我没有收到错误。

$ lame --verbose --decode test.mp3 test-lame.wav
input:  test.mp3  (44.1 kHz, 2 channels, MPEG-1 Layer III)
output: test-lame.wav  (16 bit, Microsoft WAVE)
skipping initial 529 samples (encoder+decoder delay)
Frame# 87426/88167  168 kbps   MS            

虽然帧数之间似乎存在差异,但我想这是因为 88167 是一个估计值,而不是已知的样本数。

【问题讨论】:

    标签: c++ c mp3 lame


    【解决方案1】:

    好的,我发现我有一个错误,会跳过缓冲区中的一些字节。我的实现有点复杂,因为我希望尽可能快地流式传输数据,并且有一次我错过了在继续之前清空缓冲区的情况。

    因此,如果您在代码中遇到此类错误,但未在控制台中运行 lame,则有 99% 的可能是代码中存在错误。请耐心等待并查看您的实施,并确保 100% 确保您每次都发送正确的数据。如果这有助于您调试问题,请添加一个子功能,该功能将保存您发送到 LAME 解码器的内容并将其与您的原始数据进行比较。

    最后,如果您尝试一次发送太多数据,请知道您会收到类似的错误。这是因为 LAME 库不会缓存您的大部分数据,它只能返回一个帧。

    最后,我一次发送 100 个字节到 hip_decode1_headersB() 函数,直到 MP3 结构将 header_parsed 字段设置为 true

    然后我一次最多向hip_decode1_headers() 发送 1024 (1Kb) 数据。但是,使用起来要复杂得多。您必须每次冲洗所有东西。要刷新,请使用数据指针再次调用该函数,并将长度设置为 0。该函数在返回 0 后完成刷新。当您没有更多数据并且该函数返回 0 时,您已完成解压缩整个集合MP3 数据。

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2013-04-05
      • 2019-05-30
      • 2017-08-07
      • 2017-07-20
      • 2014-09-23
      • 2014-07-25
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多