Воспроизведение нескольких песен из библиотеки iPod на iPhone одновременно с изменением высоты тона и другими эффектами

Я занимаюсь этим последние две недели, и это сводит меня с ума. Я задал этот вопрос пару дней назад (Извлеките необработанные сэмплы PCM из библиотеки iPod и поиграйте со звуковыми эффектами), и, хотя ответ дал мне полпути, я все еще застрял.

В основном то, чего я пытаюсь достичь, это загрузить несколько песен из библиотеки iPod для воспроизведения с такими эффектами, как изменение высоты тона, эффекты эквалайзера и т. Д.

Я пошел по пути AVPlayer и AVAudioPlayer, которые слишком просты. Единственная среда, которую я видел, которая может воспроизводить звук с этими эффектами, — это OpenAL. Я попробовал несколько обработчиков объектива c (Finch и ObjectAL). Finch не воспроизводит сжатый звук, в то время как ObjectAL преобразует его для меня только в том случае, если я передам URL-адрес файла (чего я не могу сделать, потому что у меня только несовместимый iPod). адрес библиотеки).

Примером приложения, которое красиво делает то, что мне нужно, является Tap DJ. Он может быстро загружать песни из библиотеки iPod (в отличие от TouchDJ) и воспроизводит их всеми возможными способами. эффектов.

Любая помощь приветствуется.


person Dino    schedule 28.01.2011    source источник


Ответы (1)


Если вы можете получить аудиоданные в необработанном формате PCM, который нравится OpenAL, вы можете загрузить их в ObjectAL.

Что вам нужно:

  • Аудиоданные
  • Размер в байтах данных
  • Формат данных (AL_FORMAT_MONO16 или AL_FORMAT_STEREO16)
  • Частота дискретизации

Вам также понадобится ALSource для воспроизведения буфера. Если вы используете это вместе с OALSimpleAudio (рекомендуется, поскольку он будет обрабатывать устройства и контексты за вас), вам нужно указать ему не использовать все доступные источники:

[OALSimpleAudio sharedInstance].reservedSources = 20; // or some number < 32

Создадим исходник (это надо сделать в init):

mySource = [[ALSource source] retain];

Вы можете создать ALBuffer с вашими пользовательскими данными следующим образом:

ALBuffer* myBuffer = [ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz];

Теперь вы можете играть:

[mySource play:myBuffer];

Редактировать: ALBuffer берет на себя управление аудиоданными и вызывает для них free(), когда они освобождаются. Так что будьте осторожны, чтобы не дважды бесплатно :)

Редактировать 2: я только что добавил свойство «freeDataOnDestroy» в ALBuffer, чтобы теперь вы могли контролировать, освобождает ли он данные или нет (по умолчанию ДА).

Редактировать 3: К черту. Я захожу так далеко, может, я иду до конца. В OALSimpleAudio добавлен метод playBuffer.

Итак, теперь вы можете просто оставаться в OALSimpleAudio:

myBuffer = [[ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz] retain];

...

id<ALSoundSource> source = [[OALSimpleAudio sharedInstance] playBuffer:myBuffer
                                                                volume:1.0
                                                                 pitch:1.0
                                                                   pan:0
                                                                  loop:NO];

[source pitchTo:2.0
       duration:5.0
         target:nil
       selector:nil];
// And so on...
person Karl    schedule 06.02.2011
comment
Также теперь есть более простой [[OALManager sharedInstance] bufferFromUrl:url reduceToMono:NO] call which internally uses bufferWithName:data:size:format:frequency. Use it to create an ALBuffer *`, а затем используйте метод playBuffer - person Courtney Christensen; 11.07.2011