gpt4 book ai didi

objective-c - 修改录制剪辑的音频音高 (m4v)

转载 作者:技术小花猫 更新时间:2023-10-29 11:24:47 27 4
gpt4 key购买 nike

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

我读过很多有关在 iOS 中更改音频音调的内容,但大多数示例都侧重于播放,即以不同的音调播放声音。

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

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

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

我也尝试过狄拉克,如下所述: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 还是其他一些库?

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

最佳答案

好吧,我可以肯定地说狄拉克一定会成功。我用过它,它确实有效。

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

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

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

此外,如果你可以转换为 PCM,在这个阶段你可以选择将狄拉克应用于未压缩的音频,要么在音频单元图上直播,要么使用他们的示例代码,而不是使用狄拉克使用的 EAFReader,只是通过你的缓冲区数据到它用来执行音高变换的缓冲区。您可能需要在那里做一些魔术,但不像编写您自己的音高转换 DSP 实现那样戏剧化。

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

关于objective-c - 修改录制剪辑的音频音高 (m4v),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10988435/

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