修改录制剪辑的音频间距(m4v)

时间:2012-06-11 22:36:45

标签: objective-c ios audio pitch

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

我已经阅读了很多关于改变iOS中音频音调的内容,但大多数例子都集中在播放上,即播放不同音高的声音。

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

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

我试图勾住上面的对象来修改音频音调,但没有成功。

我也尝试过Dirac,如下所述:Real Time Pitch Change In iPhone Using Dirac
和OpenAL一起使用AL_PITCH,如下所述:Piping output from OpenAL into a buffer
来自un4seen的“BASS”图书馆:Change Pitch/Tempo In Realtime

我没有找到任何上述库的成功,很可能是因为我真的不知道如何使用它们,以及将它们挂钩到音频保存代码的位置。

似乎有很多图书馆具有类似的效果,但专注于播放或自定义录制代码。我想操纵我已经获得的音频流(AVAssetWriterAudioInput)或修改保存的影片剪辑(.m4v)。我想让视频在视觉上不被修改,即以相同的速度播放。但我希望音频更快(如花栗鼠)或更慢(如...怪物?

您是否有任何建议我如何实时修改音高(录制电影时)或之后转换整部电影(.m4v文件)?我应该进一步了解Dirac,OpenAL,SoundTouch,BASS还是其他一些图书馆?

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

2 个答案:

答案 0 :(得分:3)

好的,我可以肯定地说,狄拉克肯定会做到这一点。我使用过它确实有用。

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

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

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

  3. 此外,如果您可以转换为PCM,在这个阶段您可以选择将dirac应用于音频单位图表上的未压缩音频,或者使用他们的示例代码,而不是使用EAFReader Dirac使用,只需通过缓冲区数据到缓冲区,用于执行音高变换。你可能需要在那里做一点魔术但不像编写自己的音高变换DSP实现那样引人注目。

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

答案 1 :(得分:1)

  • 您需要做的第一件事是来自mp4流的 demux 音频。您将需要一个解复用器(简称解复用器)来实现此目的。看看MainConcept SDKs,它们支持一系列格式。
  • 其次,你需要解码你的压缩音频,从任何格式到原始PCM。
  • 然后使用一些库来音高转换原始音频。
  • 接下来,您需要将编码音高变换音频恢复为压缩格式。
  • mux 重新进入mp4。

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