【问题标题】:Converting PCM-ALAW data to an audio file using ffmpeg使用 ffmpeg 将 PCM-ALAW 数据转换为音频文件
【发布时间】:2020-12-26 19:12:22
【问题描述】:

在我的项目中,我使用有效负载处理接收到的 RTP 数据包,并将所有有效负载提取到单独的缓冲区。此有效载荷是 - PCM ALAW(类型 8)。如何实现一个将作为参数的类 - 文件名和带有原始数据的缓冲区以创建音频文件。为了将原始数据编码到音频文件中,我必须经过哪些步骤?例如,我使用了this 示例。

【问题讨论】:

  • 你确实说过“使用 ffmpeg”。你知道如何使用 ffmpeg 做到这一点吗?没有所有 Qt 的东西。
  • 我的意思是使用 ffmpeg 库
  • 你知道用ffmpeg怎么做吗?没有所有 Qt 的东西。
  • 没有。我尝试使用我在问题中指定的示例,但它对我没有帮助。
  • 为什么对你没有帮助?

标签: c++ ffmpeg encode


【解决方案1】:

这听起来太复杂了。 “PCM ALAW”有点误导,但很明显 G.711 aLaw 编码的意思。这是一个微不足道的“压缩”,它将每个 16 位 PCM 样本映射到一个 8 位值。所以一个简单的查找就可以解决这个问题。

甚至还有免费的implementation aLaw 编码可用。只需将每个样本转换为 16 位 PCM,在其前面填充一个标准 Microsoft WAVE 标头,然后调用结果.WAV

您需要根据 RTP 类型 8 填写一些 WAV 标头。主要是“单声道,8000 Hz,每个样本 16 位”。标头的一个小问题是,只有在知道有多少样本后才能编写完整的标头。您可以在收到 RTP 数据包时更新标头,但这有点 I/O 密集型。每 10 个数据包左右执行一次可能会更好。

【讨论】:

  • 非常感谢您的回复。我不知道S16中引入了PCM-ALAW。我最初考虑在 liner 中编码 a-law,但 FFMPEG 有一个很好的工具 - swr_convert。但是我仍然尝试了您的建议,但没有帮助:(
  • @bbdd:我的代码与我现在正在处理的项目中的代码完全一致(RTP 到 WAV)。您是否尝试过我发送给您的链接中的alaw2linear 功能? swr_convert 更难。相比之下,这不是一个很好的工具。 alaw2linear 从您的 RTP 流中获取一个 aLaw 样本,并为您的 WAV 文件返回一个样本。一进一出,没有比这更简单的了。
  • 我尝试使用 alaw2liner,但不幸的是我完全失去了声音。在此之前,有很强烈的噪音+声音。
  • 如果你愿意,我们可以去聊天方便。
猜你喜欢
  • 2014-09-12
  • 2011-03-16
  • 2019-04-04
  • 1970-01-01
  • 2012-08-12
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多