Как получить образцы аудио из Python-VLC

Что мне нужно

Я работаю над музыкальным плеером с анализатором проб. Моя проблема в том, что в настоящее время я использую pydub для получения сэмплов из песни, но по мере того, как песня становится длиннее, они становятся более рассинхронизированными. Я сделал эти два буквально синхронизированными, pydub просто так получилось, что прочитал их [я даже запустил их одновременно, оба фактически постепенно десинхронизировались с одним только звуком, и более того, по мере того, как песня продолжает играть].

В принципе, есть ли python-vlc, эквивалентный pydub.AudioSegment.get_array_of_samples()?

Вы можете посмотреть документы python-vlc здесь: https://www.olivieraubert.net/vlc/python-ctypes/doc/

Что я пробовал

  1. python-vlc имеет sound.get_time(), который возвращает время последнего обновления в миллисекундах. Проблема с этой командой не в том, что она обновляется каждые полсекунды или около того [я нашел способ обойти это], а в том, что она не возвращает точное время. Я могу запустить таймер, когда он начнет играть, используя time.monotonic(). Со временем get_time() сильно отличается от таймера. У меня разница в 195 мс, 294 мс и 217 мс.

  2. Я пробовал использовать внешний таймер с помощью модуля threading. Похоже, что pydub.AudioSegment[index] вообще не синхронизируется.

  3. Масштабирование от sound.get_time() в py-vlc до len(sound) в pydub. Это работает не так, как ожидалось. Не могу сказать почему, но он все еще не синхронизирован.

  4. Использование sound.get_time() со средним смещением, которое увеличивается со временем. Похоже, что pydub.AudioSegment[index] не выстраивается должным образом.

  5. Используя aubio. Он только читает файлы WAV, и для живого анализатора преобразование в WAV сначала займет слишком много времени.

Вещи, которые я узнал

  • Я посмотрел, как долго каждая песня длится в миллисекундах, len(sound) для pydub и sound.get_length() для python-vlc обычно различаются примерно на 10 секунд.

Вещи, которые не работают

  • Используя команду pydub play(). Мне это не нравится, потому что это очень ограничивает.
  • Используя что-то еще, кроме py-vlc для воспроизведения звука, VLC имеет множество функций, которые просто невозможно воспроизвести.

Предыдущие предложения

мне любопытно

  • Есть ли модуль Python для Audacity? Я искал и не нашел. Я также могу использовать другой инструмент командной строки, который может взаимодействовать с Audacity, если это возможно [я знаю, что встроенная утилита командной строки не делает вообще ничего]

person VoxelPrismatic    schedule 24.09.2020    source источник


Ответы (1)


Вероятно, вы захотите использовать для этого непосредственно ffmpeg.

person mfkl    schedule 25.09.2020
comment
Как я могу это использовать? Я знаю, что могу использовать subprocess.run([...], capture_output = True), но какую команду в ffmpeg мне использовать? - person VoxelPrismatic; 25.09.2020
comment
что-то вроде stackoverflow.com/questions/9913032/ возможно - person mfkl; 28.09.2020
comment
Я не пытаюсь извлечь аудио, я пытаюсь получить данные аудио образца, например pydub.AudioSegment.get_array_of_samples(). В любом случае я уже работаю с аудиофайлами. - person VoxelPrismatic; 28.09.2020