2010-12-08 3 views
3

Мне просто интересно, может ли кто-нибудь объяснить мне, как я буду записывать звук, модифицируя его (шаг?) И воспроизводя его обратно пользователю на iPhone.Запись, изменение высоты тона и воспроизведение звука в реальном времени на iOS

Я не прошу кого-то сделать это для меня, всего лишь несколько намеков на то, как я должен это делать. просматривая документы, мне кажется, что я должен использовать AVAudioSession, AVAudioRecorder и AVAudioPlayer (AVFoundation.Framework) для воспроизведения частей игры. Или я должен использовать CoreAudio.Framework? и тогда возникает вопрос об изменении звука.

ответ

0

OpenAL - это библиотека, которая поддерживает то, что вы ищете. И он очень популярен на iPhone, так что, возможно, вам стоит взглянуть на это. т.е. Высота образца легко изменяемая только с одной командой:

alSourcef(source, AL_PITCH, pitch); 

Но я не уверен, если изменение тона также с AVFoundation или CoreAudio классами возможными - никогда не использовал их.

+0

Большое спасибо @Constantin Я действительно в конечном итоге с помощью OpenAL. Некоторые другие подробности можно увидеть по этому другому вопросу: http://stackoverflow.com/questions/5137853/another-question-about-recording-modifying-and-playing-audio-on-iphone – bennythemink 2011-04-01 04:11:14

0

Это может помочь. DIRAC-mobile, библиотека для реального времени темпа и манипуляции с полифоническими звуковыми сигналами. У них также есть примеры кодов, которые вы можете посмотреть сразу после загрузки библиотеки.

+0

спасибо за ссылку Jinru. Я боюсь, что использование коммерческой библиотеки для меня не вариант :( – bennythemink 2010-12-09 06:26:20

2

AVAudioUnitTimePitch должен сделать трюк.

Пример кода из udacity.com Intro to iOS App Development with Swift:

func playAudioWithVariablePitch(pitch: Float) { 
    audioEngine.stop() 
    audioEngine.reset() 

    let audioPlayerNode = AVAudioPlayerNode() 
    audioEngine.attachNode(audioPlayerNode) 

    let changePitchEffect = AVAudioUnitTimePitch() 
    changePitchEffect.pitch = pitch 
    audioEngine.attachNode(changePitchEffect) 

    audioEngine.connect(audioPlayerNode, to:changePitchEffect, format:nil) 
    audioEngine.connect(changePitchEffect, to:audioEngine.outputNode, format:nil) 

    audioPlayerNode.scheduleFile(audioFile, atTime:nil, completionHandler: nil) 
    try! audioEngine.start() 

    audioPlayerNode.play() 
}