gpt4 book ai didi

ios - 如何使用 iOS SDK(核心音频)将原始 PCM 保存到文件中?

转载 作者:行者123 更新时间:2023-12-02 23:43:23 25 4
gpt4 key购买 nike

我正在将 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 的选择不多, 我试过 CAF .理想情况下会有 PCM 原始 选项,但没有。有没有具体的 AudioFileType我应该选择,还是我需要另辟蹊径?

最佳答案

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

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

  • 有多少 channel
  • 它们是否交错
  • 采样率是多少
  • 数据是否为浮点数
  • 位深是多少
  • 等等...

  • 事实上,在 iOSOS X AudioStreamBasicDescription是一个结构,它告诉您解释 PCM 流所需的内容。出于这个原因,“原始 PCM”格式并不能真正起作用,它至少需要一些元数据。最接近原始 PCM 的格式是 WAV , AIFFCAF .如果这些不能满足您的目的,您将不得不创建自定义文件格式。但这并不难。
    extended audio file services API 是可配置的。打开要阅读的音频文件( ExtAudioFileOpenURL)后,您可以在 ExtAudioFileRef 上设置各种属性。处理。

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

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

    关于ios - 如何使用 iOS SDK(核心音频)将原始 PCM 保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35161632/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com