2009-10-08 1 views
3

Я использую Aran Mulhollan 'RemoteIOPlayer, используя звуковые дорожки в SDK для iphone. я могу без проблем: - добавление двух сигналов для микширования звуков - увеличение громкости звука путем умножения UInt32 я получаю из WAV файловКак снизить звук на sdk iphone's audioqueue?

НО каждая операция дает мне искаженный и искаженный звук, и, в частности, я могу» t разделить сигнал. Я не могу понять, что я делаю неправильно, реальный результат деления кажется прекрасным; какой-то аспект обработки звука/сигнала, очевидно, должен ускользать от меня :)

Любая помощь оценена!

ответ

1

Вы пробовали что-то вроде этого?

- (void)setQueue:(AudioQueueRef)ref toVolume:(float)newValue { 
    OSStatus rc = AudioQueueSetParameter(ref, kAudioQueueParam_Volume, newValue); 
    if (rc) { 
    NSLog(@"AudioQueueSetParameter returned %d when setting the volume.\n", rc); 
    } 
} 
+0

Как создать AudioQueueRef из AudioQueue ?? –

+0

AudioQueueRef - непрозрачный дескриптор звуковой очереди, поэтому вы не создаете AudioQueueRef из AudioQueue. Найдите AudioQueueNewInput/AudioQueueNewOutput в http://developer.apple.com/library/mac/#documentation/MusicAudio/Reference/AudioQueueReference/Reference/reference.html –

0

iPhone обрабатывает аудио как 16-битное целое число. Большинство аудиофайлов уже нормализованы, так что максимальные значения выборки являются максимальными, которые соответствуют 16-разрядному значению целого числа. Это означает, что если вы добавите два таких образца вместе, вы получите переполнение или в этом случае отсечение аудио. Если вы хотите объединить два источника звука вместе и обеспечить отсутствие обрезки, вы должны усреднить образцы: добавить их вместе и разделить на два. Или вы устанавливаете том на половину. Если вы используете децибелы, это будет примерно на -6 дБ.

+0

, уменьшая объем, является неприятным компромиссом, ИМО. Вы можете уйти от него при смешивании двух каналов - но по мере того, как вы все больше смешиваетесь, ваши каналы становятся тише и тише. Лучше (IMO) смешать ваши образцы в sint32_t и закрепить значения в диапазоне sint16_t. Результирующее обрезание происходит не так часто, как вы могли себе это представить, поскольку большинство образцов не находятся в крайности, и вы получаете все каналы на полной громкости. –

+0

Помимо смешивания выборок в 32-битном целочисленном, вы также можете реализовать динамический компрессор, который ведет себя как ограничитель с мгновенной атакой и довольно короткий (10 миллисекунд) выпуск. Он может быть реализован как фильтр IIR (бесконечный входной сигнал), с переменной, представляющей объем, который уменьшается для предотвращения отсечения, а затем медленно поднимается назад к исходному тому с каждым последующим образцом. – lucius

1

Прежде всего, код, который вы упомянули, не использует AudioQueues, он использует AudioUnits. Лучший способ смешивания аудио в iphone - использовать встроенные микшерные модули, на вашем сайте есть код, который вы загрузили с вашего исходного примера с here. Помимо этого, я бы проверял в вашем коде os, что у вас есть правильный тип данных. Вы пытаетесь выполнить операции с Unsigned ints, когда вы должны использовать подписанные? часто, что приводит к искаженным результатам (понятно)