Как использовать аудиоустройство на iPhone
-
20-08-2019 - |
Вопрос
Я ищу способ изменить высоту записанного звука при его сохранении на диске или при воспроизведении (в режиме реального времени). Я понимаю, что аудиоустройства могут быть использованы для этого. IPhone предлагает ограниченную поддержку аудиоустройств (например, насколько я могу сказать, создание / использование пользовательских аудиоустройств невозможно, но доступно несколько готовых аудиоустройств, одним из которых является AUPitch. р>
Как именно я буду использовать аудиоустройство (особенно AUPitch)? Вы как-то подключаете его в аудио-очередь? Можно ли связать аудиоустройства вместе (например, одновременно добавить эффект эха и изменение высоты тона)?
РЕДАКТИРОВАТЬ: После проверки заголовков iPhone SDK (я думаю, что AudioUnit.h, я сейчас не перед Mac), я заметил, что AUPitch закомментирован. Так что, похоже, AUPitch не доступен на iPhone. плачут плачут
В последнее время Apple, похоже, лучше организовала свою документацию по iPhone SDK на developer.apple.com - теперь труднее найти ссылки на AUPitch и т. д.
Тем не менее, я все еще заинтересован в качественных ответах по использованию аудиоустройств (в целом) на iPhone.
Решение
Здесь есть несколько очень хороших ресурсов ( http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/ ) для использования аудиоустройства RemoteIO. В своем опыте работы с аудиоустройствами на iPhone я обнаружил, что могу реализовать преобразование вручную в функции обратного вызова. При этом вы можете обнаружить, что это решает вашу проблему.
Другие советы
Что касается изменения высоты тона на iPhone, OpenAL - это путь. Проверьте класс SoundManager, доступный на сайте www.71squared.com, для отличного примера звукового движка OpenAL, который поддерживает высоту звука.
- (void)modifySpeedOf:(CFURLRef)inputURL byFactor:(float)factor andWriteTo:(CFURLRef)outputURL {
ExtAudioFileRef inputFile = NULL;
ExtAudioFileRef outputFile = NULL;
AudioStreamBasicDescription destFormat;
destFormat.mFormatID = kAudioFormatLinearPCM;
destFormat.mFormatFlags = kAudioFormatFlagsCanonical;
destFormat.mSampleRate = 44100 * factor;
destFormat.mBytesPerPacket = 2;
destFormat.mFramesPerPacket = 1;
destFormat.mBytesPerFrame = 2;
destFormat.mChannelsPerFrame = 1;
destFormat.mBitsPerChannel = 16;
destFormat.mReserved = 0;
ExtAudioFileCreateWithURL(outputURL, kAudioFileCAFType,
&destFormat, NULL, kAudioFileFlags_EraseFile, &outputFile);
ExtAudioFileOpenURL(inputURL, &inputFile);
//find out how many frames is this file long
SInt64 length = 0;
UInt32 dataSize2 = (UInt32)sizeof(length);
ExtAudioFileGetProperty(inputFile,
kExtAudioFileProperty_FileLengthFrames, &dataSize2, &length);
SInt16 *buffer = (SInt16*)malloc(kBufferSize * sizeof(SInt16));
UInt32 totalFramecount = 0;
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mNumberChannels = 1;
bufferList.mBuffers[0].mData = buffer; // pointer to buffer of audio data
bufferList.mBuffers[0].mDataByteSize = kBufferSize *
sizeof(SInt16); // number of bytes in the buffer
while(true) {
UInt32 frameCount = kBufferSize * sizeof(SInt16) / 2;
// Read a chunk of input
ExtAudioFileRead(inputFile, &frameCount, &bufferList);
totalFramecount += frameCount;
if (!frameCount || totalFramecount >= length) {
//termination condition
break;
}
ExtAudioFileWrite(outputFile, frameCount, &bufferList);
}
free(buffer);
ExtAudioFileDispose(inputFile);
ExtAudioFileDispose(outputFile);
}
он будет менять высоту тона в зависимости от коэффициента
Я использовал для этого аудиоустройство NewTimePitch, описание аудио компонента для этого -
var newTimePitchDesc = AudioComponentDescription(componentType: kAudioUnitType_FormatConverter,
componentSubType: kAudioUnitSubType_NewTimePitch,
componentManufacturer: kAudioUnitManufacturer_Apple,
componentFlags: 0,
componentFlagsMask: 0)
тогда вы можете изменить параметр высоты тона с помощью вызова AudioUnitSetParamater. Например, это меняет высоту звука на -1000 центов
err = AudioUnitSetParameter(newTimePitchAudioUnit,
kNewTimePitchParam_Pitch,
kAudioUnitScope_Global,
0,
-1000,
0)
Параметры этого аудиоустройства следующие
// Parameters for AUNewTimePitch
enum {
// Global, rate, 1/32 -> 32.0, 1.0
kNewTimePitchParam_Rate = 0,
// Global, Cents, -2400 -> 2400, 1.0
kNewTimePitchParam_Pitch = 1,
// Global, generic, 3.0 -> 32.0, 8.0
kNewTimePitchParam_Overlap = 4,
// Global, Boolean, 0->1, 1
kNewTimePitchParam_EnablePeakLocking = 6
};
но вам нужно всего лишь изменить параметр высоты тона для ваших целей. Чтобы узнать, как это сделать, обратитесь к ответу Джастина