1

我的应用程序包含一个音频播放器,它使用 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];

我搜索了谷歌、开发论坛、AVFoundation 编程指南和框架头文件,但没有找到更多相关信息。有谁知道这应该如何工作?

4

3 回答 3

0

恐怕您可能误解了文档(由于臭名昭著的“希望之泉永恒”效应)。AVAudioTimePitchAlgorithmSpectral 仅仅意味着“当你保持音高尽管速度发生变化时,当这是音乐时做得非常好”。有两种算法可以在改变速率的同时保持音高 - 一种更适合语音,一种更适合音乐。这意味着“使用音乐”。这并不意味着“改变音高而不改变速率”,这显然是你所追求的。AFAICT 没有任何内置的 Cocoa 触摸框架提供这样的功能。

于 2014-05-28T00:32:21.387 回答
0

对于 AVPlayer:

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

player.playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmSpectral;

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

这也应该适用于 AVAssetExportSession

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

myAVAssetExportSession.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmSpectral; // (AVAssetExportSession's default algorithm)
于 2015-08-04T16:16:59.467 回答
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文章中所引用

于 2015-11-24T07:12:56.573 回答