Core Audio - 将数据写入音频文件的开头或中间(结尾以外的地方)

Posted

技术标签:

【中文标题】Core Audio - 将数据写入音频文件的开头或中间(结尾以外的地方)【英文标题】:Core Audio - Write data to beginning or middle of audio file (somewhere other than the end) 【发布时间】:2015-05-12 08:17:54 【问题描述】:

所以,我正在开发一个录音 ios 应用程序。在我的应用程序中,我需要在用户选择的文件(在文档目录中)的任何位置写入音频,这将覆盖那里的任何音频。

示例:我录制了 3 分钟的音频,滚动到第二分钟,再次开始录制 10 秒。现在,2:00 - 2:10 包含新音频,而旧音频已消失(在此示例中音频文件不会变长)。

我正在使用 EZAudio,我可以根据需要多次录制和暂停,并且会一直添加到结尾。我打算使用ExtAudioFileSeek 在文件中向后搜索并从那里记录,但您只能在文件以只读方式打开时使用它。

我不想要的:我不想录制到不同的文件,并使用这种方法将两个文件附加在一起:https://***.com/a/10562809/1391672 与此相关的加载时间很长。 iOS 应用 Voice Memos 会立即将文件附加在一起。

ExtAudioFileWriteAsync可以用来在开头附加音频吗?还是在指定的样品位置?我应该看看另一种方法吗?

【问题讨论】:

【参考方案1】:

我认为 ExtAudioFileSeek 在录制时未定义。我使用基于 ExtAudioFile 构建的 AudioFile API。唯一需要注意的是,您必须进行自己的格式转换(如有必要,我使用 AudioConverterRef)。但是一旦你把所有这些都解决了,你就可以调用 AudioFileWritePackets,它接受一个 inStartingPacket 参数,这样你就可以在文件的任何地方写入。您还可以将 AudioFileRef 包装在 ExtAudioFileRef 中,以便在文件仍处于打开状态以使用 ExtAudioFileWrapAudioFileID 进行录制时进行播放。标头位于 AudioFile.h 和 AudioConverter.h 中。

【讨论】:

如果我指定一个 inStartingPacket 并开始写入音频,它会覆盖已经存在的内容,还是将所有内容都转移过来(就像在指定索引处插入时的数组一样)? 是的,它会覆盖那里的内容。 感谢您的信息。如果您有任何指向不想学习核心音频的人的示例代码或资源的链接,请告诉我。我不想学习它的原因是因为我的应用程序使用 EZAudio 库完成了 99%。我只需要进行一次修改就可以了。所以我不想花下一年的时间学习核心音频,只是为了在文件的指定位置录制。因此,任何资源都会有所帮助。我也在环顾四周。 在保存到文件之前是否需要转换音频格式?如果是这样,您的输入/输出格式是什么? 我不这么认为,也许 EZAudio 进行了转换,但我认为它是以 .m4a 格式录制和保存的。

以上是关于Core Audio - 将数据写入音频文件的开头或中间(结尾以外的地方)的主要内容,如果未能解决你的问题,请参考以下文章

Core Audio 大(压缩)文件播放和内存占用

Core Audio - CARingBuffer 读取音频文件进行回调

使用 Core Audio 从 PCM 原始数据中获取电平值

Core Audio:用于提升信号电平的音频单元

Core Audio / OpenAL 会重新采样音频文件吗?

WebRTC Windows Native音频中的Core Audio API