9

我正在编写一个应用程序,我在录制电影(.m4v)时试图改变音频的音高。或者通过之后修改电影的音频音高。我希望最终结果是一部电影(.m4v),它具有原始长度(即与原始视觉相同)但具有修改的音高,例如“花栗鼠声音”。如果可能的话,最好选择实时转换。

我已经阅读了很多关于在 iOS 中更改音频音高的文章,但大多数示例都侧重于播放,即以不同的音高播放声音。

在我的应用程序中,我正在录制电影 (.m4v / AVFileTypeQuickTimeMovie) 并使用标准 AVAssetWriter 保存它。保存电影时,我可以访问以下我试图操纵音频的元素(例如修改音高):

  • 音频缓冲区 (CMSampleBufferRef)
  • 音频输入编写器 (AVAssetWriterAudioInput)
  • 音频输入写入器选项(例如 AVNumberOfChannelsKey、AVSampleRateKey、AVChannelLayoutKey)
  • 资产编写器 (AVAssetWriter)

我试图挂钩上述对象来修改音频音高,但没有成功。

我也尝试过使用 Dirac,如下所述:Real Time Pitch Change In iPhone Using Dirac
And OpenAL with AL_PITCH as described here:将OpenAL 的输出管道传输到缓冲区
和 un4seen 的“BASS”库:实时更改音高/速度

我没有发现上述任何库的成功,很可能是因为我真的不知道如何使用它们,也不知道在哪里将它们连接到音频保存代码中。

似乎有很多库具有类似的效果,但侧重于播放或自定义录制代码。我想操作已有的音频流 (AVAssetWriterAudioInput) 或修改保存的影片剪辑 (.m4v)。我希望视频在视觉上保持不变,即以相同的速度播放。但我希望音频更快(如花栗鼠)或更慢(如......怪物?

您对我如何实时(录制电影时)或之后通过转换整个电影(.m4v 文件)修改音高有什么建议吗?我应该进一步研究 Dirac、OpenAL、SoundTouch、BASS 还是其他一些库?

我希望能够通过修改过的音频与其他人分享电影,这就是我不能仅仅依靠修改音高来播放的原因。

4

2 回答 2

3

好吧,我可以肯定地说,狄拉克肯定会成功。我已经使用它并且它确实有效。

我对视频处理没有太多经验,但如果在某个时候你可以隔离音轨,那就小菜一碟了。

  1. 如果你能做到这一点,那么只需将它保存到一个文件中并使用 dirac 的时间拉伸示例代码,它并没有说它,但它也会进行音高转换,你设置三个参数来转换你的音频(时间拉伸因子,音高转换分/音*以及共振峰移位)。

  2. 如果您不想将其保存到文件中,那么只需将其转换为 PCM 并在音频单元上执行一些 DSP。老实说,您需要一些关于数学和音频处理的严肃知识才能做到这一点,但是那里有很多很好的示例项目(github(Tom Zic 的 AudioGraph))可以为您提供所需的东西,不要忘记在您的工作中提及所有这些开发人员代码。

此外,如果您可以转换为 PCM,则在此阶段您可以将 dirac 应用于未压缩的音频,或者在音频单元图上实时显示,或者使用它们的示例代码,而不是使用 Dirac 使用的 EAFReader,只需将缓冲区数据传递到它用于执行音高转换的缓冲区。您可能需要在那里做一些魔术,但不像编写自己的音高转换 DSP 实现那样引人注目。

最重要的是,如果您只能要求 AVFoundation 处理视频,那么您可以进行音频单元实时处理并设置回调,因此每次处理它时,您都可以将处理后的数据传递给文件,或者可能传递给您的 avassetwriter,我是不太确定这最后一块是否可行。如果不可能,那么解决方案是分别同步和保存视频和音频,尽管我可以想象这是一个巨大的问题,因为它们都会尝试同时写入磁盘。请让我知道它是怎么回事,我现在很感兴趣。

于 2012-08-27T16:18:06.557 回答
1
  • 您需要做的第一件事是从 mp4 流中解复用音频。您将需要一个解复用器(简称解复用器)来实现这一点。看看MainConcept SDKs,它们支持一堆格式。
  • 其次,您需要将压缩音频从任何格式解码为原始 PCM。
  • 然后使用一些库来改变原始音频。
  • 接下来,您需要将音高偏移的音频编码回压缩格式。
  • 复用回 mp4。

由于解码编码,您将在此过程中失去一些音频质量。您的视频将保持不变。

于 2013-03-21T20:55:11.733 回答