2011-01-21 4 views
3

Я хочу смешивать аудиофайлы разного размера в один .wav-файл без обрезки любого файла, т. Е. Полученный размер файла должен быть равен максимальному размеру файла.Смешивание звуковых файлов разного размера

Существует образец, через который мы можем смешать файлы того же размера

[(http://www.modejong.com/iOS/#ex4) (пример 4)].

Я изменил код, чтобы получить смешанный файл как .wav-файл.

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

ответ

1

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

Обратите внимание, что в примере кода говорится, что он возвращает ошибку, если будет отсечение (сумма волн больше, чем максимальное представимое значение). Это условие более вероятно, если вы смешиваете несколько входов. Наилучшим способом создания этого является создание "headroom" во входных волнах. Вы можете сделать это либо при предварительной обработке, гарантируя, что объем каждой волны не превышает X% от максимальной. (~ 80-90%, в зависимости от количества входов). Другой способ - сделать это динамически в коде микшера, умножив каждый образец на некоторое значение < 1.0, когда вы добавите его в микс.

Если вы выбираете волны для смешивания во время выполнения, а отказ из-за отсечения является неприемлемым, вам нужно будет изменить образец кода, чтобы вывести значения с max/min вместо возврата ошибки. Не позволяйте им переполняться, или вы получите шумные артефакты.

(Clipping также создает артефакты, но когда вы не создали достаточный запас высоты перед смешиванием, это определенно предпочтительнее переполнения. Это более знакомое звучание типа искажений, похожее на то, что вы получаете, когда вы перегружаете свой . спикеры См this wikipedia article on clipping:

Отсечение предпочтительнее альтернативы в цифровых системах, оберточной, которая возникает, если цифровой аппаратный разрешено «переполнение», не обращая внимания на наиболее значимые биты величины, а иногда даже знак от величины выборки, что приводит к грубым искажениям сигнала.

+0

Пинчинг до макс/мин звучит довольно ужасно! –

0

Как бы я это сделал:

Очень похоже на функцию mix_buffers, с которой вы связались, но введите 2 параметра для mixbufferNumSamples. Итерации по всему более длинному из двух буферов. Когда индекс вышел за пределы более короткого буфера, просто установите образец из этого буфера на 0 для остальной части функции.

Если вы должны избежать отсечения и сделать это в режиме реального времени и вы ничего не знаем об этих двух звуков, вы должны обеспечить достаточный запас. Простейший способ является сокращение вдвое каждого из образцов перед смешиванием:

mixed = s1/2 + s2/2; 

Это гарантирует, что полученный смешанный образец не будет переполнение в int16_t.Это будет иметь побочный эффект, делая все более спокойным, хотя.

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

Или вы можете смешать их все в полном объеме с буфером int32_t, отслеживая самый большой (амплитудный) смешанный образец, а затем возвращайтесь через буфер, умножая каждый образец на масштабный коэффициент, который сделает этот крайний образец просто достигли пределов + 32767/-32768.

Смежные вопросы