Как установить высоту звука в аудиофайле или записанном аудиофайле в iphone SDK?
Я записываю файл или у меня есть аудиофайл. Я хочу изменить высоту звука и воспроизвести аудиофайл. Как я могу установить высоту звука в программе iphone, которая использует target-c.
Пожалуйста, помогите мне выйти из этого.
Спасибо, Мадан Мохан.
3 ответа
Наивный подход заключается в воспроизведении с использованием другой частоты дискретизации по сравнению с частотой дискретизации, используемой для записи файла. Например, если файл был записан с Fs=44100 Гц, то воспроизведение его с Fs=22050 Гц даст вам половину исходного шага.
Конечно, этот наивный подход включает в себя изменение длительности файла и других артефактов, связанных со звуком. Если вам нужно что-то менее наивное, вам придется самостоятельно реализовать алгоритм смещения высоты тона, и это огромная тема - я предлагаю вам начать с поиска pitch shift
в гугле.
Вы можете воспроизводить звук с измененной высотой звука, используя AVAudioEngine, AVAudioPlayerNode. Образец протестированного кода приведен ниже.
@interface ViewController (){
AVAudioEngine *engine;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self playAudio];
}
-(void)playAudio{
engine = [[AVAudioEngine alloc] init];
NSString* path=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp3"];
NSURL *soundUrl = [NSURL fileURLWithPath:path];
AVAudioFile* File = [[AVAudioFile alloc] initForReading: soundUrl error: nil];
AVAudioPlayerNode* node = [AVAudioPlayerNode new];
[node stop];
[engine stop];
[engine reset];
[engine attachNode: node];
AVAudioUnitTimePitch* changeAudioUnitTime = [AVAudioUnitTimePitch new];
//change this rate variable to play fast or slow .
changeAudioUnitTime.rate = 1;
//change pitch variable to according your requirement.
changeAudioUnitTime.pitch = 100;
[engine attachNode: changeAudioUnitTime];
[engine connect:node to: changeAudioUnitTime format: nil];
[engine connect:changeAudioUnitTime to: engine.outputNode format:nil];
[node scheduleFile:File atTime: nil completionHandler: nil];
[engine startAndReturnError: nil];
[node play];
}
Убедитесь, что переменная пути имеет правильный путь к файлу
Примечание: этот код протестирован на реальном устройстве и работает нормально в моем проекте. Не забудьте добавить CoreAudio.framework, AVFoundation.framework.
You can use the soundtouch open source project to change pitch
Вот ссылка: http://www.surina.net/soundtouch/
После того, как вы добавите soundtouch в свой проект, вы должны указать путь к входному звуковому файлу, путь к выходному звуковому файлу и изменение высоты тона в качестве входных данных.
Так как обработка звука занимает больше времени, лучше изменить soundtouch так, чтобы при записи голоса непосредственно передавались данные для обработки. Это сделает ваше приложение лучше.
Рекомендации