我的应用包括一个音频播放器,它使用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和框架头文件,但没有找到更多相关信息。有谁知道这应该如何工作?
答案 0 :(得分:0)
我担心你可能误解了这些文件(由于臭名昭着的“希望弹簧永恒”效应)。 AVAudioTimePitchAlgorithmSpectral仅仅意味着“当你保持音高但速度发生变化时,在这是音乐的时候做得非常好”。有两种算法可以在改变速率时保持音高 - 一种更适合语音,一种更好的音乐。这意味着“使用音乐一个”。它并不意味着“在不改变速率的情况下改变音高”,这是你显然所追求的。 AFAICT没有任何此类功能由任何内置的Cocoa触摸框架提供。
答案 1 :(得分:0)
:
在播放器项目上设置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];
中引用