Изменение скорости mp3 в Qt и C++ [QMediaPlayer]

Я пытаюсь разработать небольшое приложение, в которое можно загружать mp3-файл и воспроизводить его с переменной скоростью! (Я знаю, что он уже существует :-))

Я использую Qt и C++. У меня уже есть базовый плеер, но я застрял на скорости, потому что я хочу плавно менять скорость (как в Mixxx), не останавливая воспроизведение! QMediaPlayer всегда останавливается, если я изменяю значение и создаю разрыв в звуке. Также я не хочу, чтобы шаг изменился!

Я уже нашел что-то под названием "SoundTouch", но теперь я совершенно не понимаю, что с ним делать, как обрабатывать мои mp3-данные и как передать их в плеер! Библиотека SoundTouch способна делать то, что я хочу, я получил это из примеров на домашняя страница.

  • Как мне импортировать файл mp3, чтобы я мог обработать его с помощью функций SoundTouch
  • Как я могу воспроизвести вывод функции SoundTouch? (Возможно, QMediaPlayer справится с этой задачей?)
  • Как это делается вживую? Я должен сделать какой-то стрим, я думаю? Так что я могу менять скорость во время игры и продолжать играть без пауз. Графически в моей голове это должно быть что-то, что находится между данными и плеером, где все данные должны проходить в реальном времени, с небольшим буфером (20-50 мс или около того) позади, чтобы избежать пробелов при обработке будущих данных.

Любая помощь приветствуется! Я также открыт для любого другого решения, кроме "SoundTouch", пока я могу оставаться с Qt/C++!

(Второе: я хочу просмотреть обзор волновой формы, а также ее движущуюся часть (вокруг фактического положения песни), чтобы я мог также использовать подсказки о том, как получить данные волновой формы)

Заранее спасибо!


person mais88    schedule 12.10.2015    source источник


Ответы (1)


На данный момент (Qt 5.5) это невозможно сделать только с QMediaPlayer. Вам необходимо сделать следующее:

  • Декодируйте звук с помощью GStreamer, FFMpeg или (нового) QAudioDecoder: http://doc.qt.io/qt-5/qaudiodecoder.html — это даст вам необработанный поток PCM;

  • Примените SoundTouch или другую библиотеку к этим необработанным данным, чтобы изменить высоту тона. Если GPL подходит, взгляните на http://nsound.sourceforge.net/examples/index.html, если вы разрабатываете собственные материалы, STK может быть лучшим выбором: https://ccrma.stanford.edu/software/stk/

  • Выведите измененные данные на аудиоустройство с помощью QAudioOutput.

Эта стратегия максимально использует Qt и обеспечивает наилучшее покрытие платформы (вы все равно теряете Android, поскольку он не поддерживает QAudioOutput).

person George Y.    schedule 09.01.2016