Разделение музыкального файла на куски

Как бы вы разбили музыкальный файл (желательно mp3) на куски?

Я использую API SDL_mixer. Там может быть несколько полезных функций, но я не смог их найти.

Цель состоит в том, чтобы использовать БПФ на каждом фрагменте, чтобы получить частоты для визуализации.

1 ответ

Решение

Теперь я вижу, что библиотека SDL_mixer не даст вам того, что вы хотите. Его поддержка "музыки" (MP3) воспроизводит файл извне из микшера, поэтому, кроме средств управления громкостью и положением, которые предоставляет API, вы не можете вставить себя в его аудиопоток.

Если бы вы использовали Mix_Chunk вместо того, чтобы использовать объекты микшера каналов, вы можете добавить себя в качестве эффекта на канал, который транслирует музыку, используя Mix_RegisterEffect, Еще одно место, куда вы можете вставить себя, - это после микширования Mix_SetPostMix, если вы хотите визуализировать окончательный набор фрагментов вместо отдельного канала или каналов. Тем не менее, эти фрагменты лучше всего подходят для коротких звуков, поскольку они загружаются полностью в память, а не в потоковом режиме - и в настоящее время они не поддерживают MP3.

Если вы решили использовать SDL, рассмотрите возможность использования SDL_sound для этой задачи. Это еще одно расширение для SDL, которое обрабатывает только декодирование файлов. Он передает вам данные в тот момент, когда вы используете Sound_Decode, Затем вы можете взять декодированные данные и передать их в микшер, используя Mix_HookMusic сохранить потоковый подход. Или вы можете даже загрузить весь файл с Sound_DecodeAllи заполните Mix_Chunk напрямую, если вы хотите воспользоваться функциями микшера и эффектов, за счет потоковой передачи.

На что нужно обратить внимание:

  1. Убедитесь, что аудио декодируется в выходном формате, который ожидает микшер.
  2. Обращайте внимание на любой случай, когда декодер не может поспевать за микшером, - в этом случае вам нужно было бы разработать отдельный процесс для декодирования, чтобы вы могли выполнять потоковую передачу впереди того места, где находится микшер, и обрабатывать его. случайные затруднения при чтении без сбоев.
  3. Могут быть случаи, когда размер блока, который вы получаете от декодера, не соответствует размеру блока, который вы хотите проанализировать. Вы могли бы использовать Sound_SetBufferSize чтобы упростить эту проблему.
Другие вопросы по тегам