如何使用AVAudioTime Pitch Algorithm Spectral?

时间:2014-05-28 00:04:11

标签: ios avfoundation avplayer pitch-shifting

我的应用包括一个音频播放器,它使用AVAudio播放iPod音乐库中的音频文件。我想为播放器添加一个音高变换功能,我看过的音高变换库需要使用不同的音频框架编写一个新的播放器。

我目前正在使用AVAudioMix来改变播放器中的音量,我注意到其中一个音频输入参数是audioTimePitchAlgorithm,其常量AVAudioTimePitchAlgorithmSpectral看起来就像我需要的那样。文档说它支持从1/32到32的可变速率。但我无法弄清楚如何设置该速率。

这是我到目前为止的代码(基于this SO answer),并显示缺失的部分:

AVPlayer *player = self.audioPlayer;
NSArray *audioTracks = [player.currentItem.asset tracksWithMediaType:AVMediaTypeAudio];
NSMutableArray *allAudioParams = [NSMutableArray array];
for (AVAssetTrack *track in audioTracks) {
    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters];
    audioInputParams.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmSpectral;
    audioInputParams.audioTimePitchRate = 0.5; <-- NEED SOMETHING LIKE THIS
    audioInputParams.trackID = [track trackID];
    [allAudioParams addObject:audioInputParams];
}
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
[audioMix setInputParameters:allAudioParams];
[player.currentItem setAudioMix:audioMix];

我搜索了Google,开发论坛,AVFoundation Programming Guide和框架头文件,但没有找到更多相关信息。有谁知道这应该如何工作?

3 个答案:

答案 0 :(得分:0)

我担心你可能误解了这些文件(由于臭名昭着的“希望弹簧永恒”效应)。 AVAudioTimePitchAlgorithmSpectral仅仅意味着“当你保持音高但速度发生变化时,在这是音乐的时候做得非常好”。有两种算法可以在改变速率时保持音高 - 一种更适合语音,一种更好的音乐。这意味着“使用音乐一个”。它并不意味着“在不改变速率的情况下改变音高”,这是你显然所追求的。 AFAICT没有任何此类功能由任何内置的Cocoa触摸框架提供。

答案 1 :(得分:0)

AVPlayer的

在播放器项目上设置audioTimePitchAlgorithm并调整播放器速率。

player.playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmSpectral;

现在更改为您的播放器速率将调整音频音调。

这也适用于AVAssetExportSession

将音频缩放到新的持续时间,音频将保留原始音高。

myAVAssetExportSession.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmSpectral; // (AVAssetExportSession's default algorithm)

答案 2 :(得分:0)

实际上,我认为你想要看的是 AVAudioTimePitchAlgorithmVarispeed会改变音高。

AV Foundation Audio Settings Constants部分所述 时间间距算法设置

  

高品质,无间距校正。音高随着速率而变化。变量   率从1/32到32。

此外,你只需要做这样的事情

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmVarispeed;
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
[player play];

this SO article

中引用