【问题标题】:How to save just raw PCM to file with iOS SDK (Core Audio)?如何使用 iOS SDK(核心音频)将原始 PCM 保存到文件中?
【发布时间】:2016-05-11 17:45:31
【问题描述】:

我正在将 MP3 文件转换为原始 PCM,我需要将其保存为原始 PCM。 (注意,我正在使用 Java/RoboVM 移植到 iOS。)

我正在使用 coreaudio 包,我的代码的相关部分如下所示:

// Define the output PCM format.
AudioStreamBasicDescription outputFormat = new AudioStreamBasicDescription();
outputFormat.setFormat(AudioFormat.LinearPCM);
outputFormat.setFormatFlags(AudioFormatFlags.Canonical);
outputFormat.setBitsPerChannel(16);
outputFormat.setChannelsPerFrame(1);
outputFormat.setFramesPerPacket(1);
outputFormat.setBytesPerFrame(2);
outputFormat.setBytesPerPacket(2);
outputFormat.setSampleRate(22050);

// ...

outputFile = ExtAudioFile.create(outputFileURL, AudioFileType.CAF, outputFormat, null, AudioFileFlags.EraseFile);

然后我运行一个循环,从 MP3 文件读取并写入输出文件。

将这个原始文件导入 Audacity 后,我注意到它在开始时总是有一个尖峰,这表明它实际上不是原始 PCM 文件,而是位于带有标题的包装器内(无论是 WAV 还是 CAF 标题,等)。

我知道我可以只删除文件并去掉标题并获取原始 PCM 数据,但就我的应用程序这一部分的空间/性能而言,如果我能保持简单并保存,我会很高兴原始 PCM 数据没有包装器,但我不知道该怎么做。


问题出现在这里:

outputFile = ExtAudioFile.create(outputFileURL, AudioFileType.CAF, outputFormat, null, AudioFileFlags.EraseFile);

AudioFileType 的选择不多,我试过 WAVECAF。理想情况下会有 PCMRAW 选项,但没有。我应该选择一个特定的AudioFileType,还是需要另一种方式?

【问题讨论】:

    标签: ios audio core-audio robovm


    【解决方案1】:

    extended audio file services 框架不支持“原始”PCM 格式。

    要让应用程序了解 PCM 格式,它需要了解以下数据:

    • 有多少个频道
    • 它们是否交错
    • 什么是采样率
    • 数据是否为浮点数
    • 什么是位深度
    • 等等……

    事实上,在iOSOS X 上,AudioStreamBasicDescription 是一个结构,它告诉您解释 PCM 流所需的内容。出于这个原因,“原始 PCM”格式并不能真正起作用,它至少需要一些元数据。最接近原始 PCM 的格式是 WAVAIFFCAF。如果这些不能满足您的目的,您将不得不创建自定义文件格式。但这并不难。


    extended audio file services API 非常可配置。打开要读取的音频文件 (ExtAudioFileOpenURL) 后,您可以在 ExtAudioFileRef 句柄上设置各种属性。

    在您的情况下,请考虑设置kExtAudioFileProperty_ClientDataFormat。此属性控制从文件中读取的 PCM 数据的格式。当ExtAudioFileRead 解码输入文件时,它会将它发送的数据转换回您指定的格式。这种方法有一些限制。 IIRC,它不支持进行采样率转换之类的事情。

    当您读取正确解码的数据时,您可以使用 NSOutputStream 之类的东西将您选择的“原始 PCM”格式直接写入完全没有元数据的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多