Микширование звуковых файлов разного размера - PullRequest
3 голосов
/ 21 января 2011

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

Существуетпример, через который мы можем смешивать файлы одинакового размера

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

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

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

Ответы [ 2 ]

1 голос
/ 11 марта 2011

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

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

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

(Отсечение также создает артефакты, но когда вы не создали достаточный запас до микширования, это определенно предпочтительнее переполнения. Это более знакомый тип искажения, аналогичный тому, который вы получаете, когда выперегрузите ваши динамики. См. эту статью в Википедии об отсечении :

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

0 голосов
/ 17 марта 2011

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

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

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

 mixed = s1/2 + s2/2;

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...