修改录制的音频片段(m4v)的音调

9
我正在编写一个应用程序,尝试在录制 (.m4v) 电影时更改音频的音调。或者事后修改电影的音调。最终结果是获得一个 (.m4v) 电影,它与原始长度相同(即视觉效果相同),但声音音调已经被修改,例如 "花栗鼠声音"。如果可能,实时转换将优先考虑。
我已经阅读了很多有关在iOS中更改音频音调的文章,但大多数示例都专注于播放,即使用不同的音调播放声音。
在我的应用程序中,我正在录制电影 (.m4v / AVFileTypeQuickTimeMovie),并使用标准的AVAssetWriter保存它。保存电影时,我可以访问以下元素,我已经尝试过操纵音频(例如修改音调):
- 音频缓冲区 (CMSampleBufferRef) - 音频输入编写器 (AVAssetWriterAudioInput) - 音频输入编写器选项 (例如AVNumberOfChannelsKey、AVSampleRateKey、AVChannelLayoutKey) - 资产编写器 (AVAssetWriter)
我尝试连接上述对象以修改音频音调,但没有成功。
我还尝试使用Dirac,如此处所述:Real Time Pitch Change In iPhone Using Dirac,和使用AL_PITCH的OpenAL,如此处所述:Piping output from OpenAL into a buffer,以及来自un4seen的 "BASS" 库: Change Pitch/Tempo In Realtime
我没有通过上述任何库找到成功,最可能是因为我不知道如何使用它们,在哪里将它们连接到音频保存代码中。
有许多具有类似效果但专注于播放或自定义记录代码的库。我想操纵我已经获得的音频流 (AVAssetWriterAudioInput),或修改保存的电影片段 (.m4v)。我希望视频在视觉上不被修改,即以相同速度播放。但我希望声音变快 (像花栗鼠) 或变慢 (像...怪物?)。
您有什么建议,如何实时修改音调(录制电影时)或后期转换整个电影 (.m4v文件)的音调?我应该进一步了解Dirac、OpenAL、SoundTouch、BASS或其他库吗?
我希望能够与其他人分享具有修改后的音频的电影,这就是我不能仅依赖于仅用于播放的修改音调的原因。
2个回答

3

好的,我可以肯定地说dirac绝对能解决问题。我使用过它,它确实有效。

我在视频处理方面没有太多经验,但如果你能隔离音频轨道,那就很容易了。

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

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

此外,如果你能转换为PCM,在这个阶段你可以选择将未压缩的音频直接应用dirac进行处理,要么在音频单元图上进行实时处理,要么使用它们的示例代码,而不是使用EAFReader Dirac使用的,只需将你的缓冲区数据传递给它用于执行音高转换的缓冲区即可。你可能需要在那里做一些魔术,但不像编写自己的音调转换DSP实现那样戏剧性。

底线是,如果你可以让AVFoundation只处理视频,那么你可以进行音频单元的实时处理,并设置回调函数,以便每次处理时都可以将处理后的数据传递给文件,或者可能是给你的AVAssetWriter,我不太确定这最后一部分是否可行。如果不可能,那么解决方案就是同步并分别保存视频和音频,尽管我可以想象这将是一个巨大的问题,因为它们都会试图同时写入磁盘。请告诉我进展如何,我很感兴趣。


1
  • 首先需要做的是从mp4流中分离音频。为此,您需要使用分离器(简称demuxer)。查看MainConcept SDKs,它们支持许多格式。
  • 其次,您需要将压缩音频解码成原始PCM格式。
  • 然后使用某个库来变调原始音频。
  • 接下来需要重新编码变调后的音频为压缩格式。
  • 最后再进行复用到mp4文件中。

由于解码-编码过程会导致一些音频质量的损失,因此您的视频将保持不变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接