Разделение музыкального файла на куски
Как бы вы разбили музыкальный файл (желательно 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
напрямую, если вы хотите воспользоваться функциями микшера и эффектов, за счет потоковой передачи.
На что нужно обратить внимание:
- Убедитесь, что аудио декодируется в выходном формате, который ожидает микшер.
- Обращайте внимание на любой случай, когда декодер не может поспевать за микшером, - в этом случае вам нужно было бы разработать отдельный процесс для декодирования, чтобы вы могли выполнять потоковую передачу впереди того места, где находится микшер, и обрабатывать его. случайные затруднения при чтении без сбоев.
- Могут быть случаи, когда размер блока, который вы получаете от декодера, не соответствует размеру блока, который вы хотите проанализировать. Вы могли бы использовать
Sound_SetBufferSize
чтобы упростить эту проблему.