Разделение музыкального файла на куски - PullRequest
1 голос
/ 26 июня 2011

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

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

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

1 Ответ

0 голосов
/ 26 июня 2011

Теперь я вижу, что библиотека 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 для упрощения этой проблемы.
...