Всех приветствую. Сегодня хочу поделиться опытом создания своего первого проекта на Python. Мой проект — это простой аудиоплеер, и я хочу рассказать, как я его создавал, с какими сложностями столкнулся и что из этого вышло.

Почему Python?

Выбор языка для первого проекта — это всегда непросто. Я выбрал Python по нескольким причинам:

Простота синтаксиса. Python очень читабельный и понятный, что идеально подходит для новичков.

Богатая стандартная библиотека и сообщество. Множество готовых решений и библиотек, которые можно использовать в своих проектах.

Популярность в разработке. Python — один из самых популярных языков программирования, и навыки работы с ним будут полезны в будущем.

Идея проекта

Моя цель была написать простой аудиоплеер, который мог бы играть основные аудиоформаты. Я хотел, чтобы пользователь мог выбирать треки, ставить их на паузу и останавливать, так же изменять скорость проигрывания.

Используемые библиотеки

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

PySide6: библиотека для создания интерфейсов созданная разработчиками Qt, имеет хорошую поддержку сообщества и регулярные обновления, в дополнение к ней использовал qdarktheme для стилизации интерфейса.

FFmpeg: Универсальный инструмент для обработки видео и аудио.

Sounddevice: Библиотека для воспроизведения и записи звука в Python.

Mutagen: Библиотека для извлечения данных из аудиофайлов.

Как это работает

Аудиообработка

Выбор файла:

Пользователь выбирает аудиофайл из меню "Файл". Поддерживаемые форматы включают MP3, WAV, FLAC, OGG, M4A, AAC и WMA.

Декодирование с помощью FFmpeg:

Выбранный файл передаётся в FFmpeg через подпроцесс для извлечения необработанных аудиоданных. Используемая команда:

ffmpeg -v quiet -i <путь_к_файлу> -f f32le -acodec pcm_f32le -ac 2 -ar <частота_дискретизации> -

Обработка данных

Чтение аудиоданных:
Аудиоданные считываются блоками и сохраняются в массив NumPy для эффективной обработки.

Регулировка громкости:
Регулировка громкости осуществляется путём умножения аудиомассива на коэффициент громкости.

Регулировка скорости воспроизведения:
Скорость воспроизведения (например, 2x) управляется через библиотеку sounddevice путём изменения частоты дискретизации.

Воспроизведение

Поток вывода:
Обработанные аудиоданные передаются на аудиовыход через библиотеку sounddevice.

Управление воспроизведением:
Элементы управления, такие как воспроизведение/пауза, следующий/предыдущий трек и перемотка, обрабатываются через класс AudioTrigger.

Управление воспроизведением

Воспроизведение/Пауза:
Использует класс AudioTrigger для начала/остановки аудиопотока.

Следующий/Предыдущий трек:
Обновляет текущий индекс трека и загружает следующий/предыдущий трек в плейлисте.

Перемотка:
Регулирует позицию воспроизведения, пересчитывая индекс позиции на основе значения ползунка.

Управление очередью треков

Виджет очереди треков:
Отображает добавленные ранее папки.

Виджет плейлиста:
Отображает содержимое папки.

Виджет информации о треке:
Показывает метаданные и обложку для воспроизводимого трека.

Исходный код и дополнительные ресурсы

Если хотите ознакомиться с исходным кодом или внести свой вклад в проект,

приглашаю вас посетить страницу GitHub проекта. Там вы найдёте весь исходный код аудиоплеера.

Также у проекта есть веб-сайт, где вы можете скачать готовые .exe и .deb пакеты для Windows и Linux. Здесь же доступна подробная документация по установке и использованию программы.

С какими сложностями я столкнулся

1. Декодирование и буферизация

Работа с FFmpeg требовала правильной организации буферизации аудиоданных, чтобы избежать прерываний и задержек при воспроизведении.

Решение: Буферизация данных в массив NumPy.

2. Неправильная скорость трека

Треки воспроизводились с неправильной скоростью из-за некорректной частоты дискретизации.

Решение: Я считываю частоту дискретизации трека и открываю аудиопоток с настройками именно для того трека, который в данный момент должен воспроизводиться.

Что в итоге получилось

В результате я создал аудиоплеер с основными функциональными возможностями:

Проигрывание аудиофайлов: Поддерживаются популярные форматы MP3, WAV, FLAC, OGG, M4A, AAC и WMA.

Управление воспроизведением: Воспроизведение, пауза, остановка, перемотка, следующий/предыдущий трек.

Регулировка скорости воспроизведения: Возможность воспроизводить треки быстрее или медленнее.

Плейлист: Добавление папок с треками.

Информация о треках: Отображение метаданных и обложек альбомов.

Тёмная тема: Благодаря qdarktheme, аудиоплеер имеет современный и стильный интерфейс.

Планы на будущее

  1. Добавить поддержку потокового аудио: Возможность воспроизводить музыку из интернет-радиостанций и стриминговых сервисов.

  2. Расширить функциональность плейлиста: Добавить возможность создания и сохранения пользовательских плейлистов.

  3. Поддержка эквалайзера: Добавить эквалайзер для настройки звука.

Заключение

Создание аудиоплеера на Python оказалось полезным опытом. Я научился работать с аудио на низком уровне, обрабатывать потоки и создавать пользовательский интерфейс.

Буду рад любым отзывам и предложениям по улучшению плеера. Спасибо за внимание!

Ссылки:

Исходный код на GitHub

Сайт проекта с загрузкой пакетов

Скрины интерфейса

Темная тема
Темная тема
Светлая тема
Светлая тема

Комментарии (10)


  1. Semy
    04.06.2024 15:29

    А зачем две директории с одинаковыми файлами для Linux и Windows? На сколько я могу видеть, там разница только в resources.


    1. Niamorro Автор
      04.06.2024 15:29

      при работе с FFmpeg с помошью subprocess в windows нужно вызвать creationflags=subprocess.CREATE_NO_WINDOW для того чтобы при обработке трека пользователь не видел консоль FFmpeg, в линукс флага CREATE_NO_WINDOW не существует, там этого не требуется, с FFmpeg работает модуль audiotrigger.py


  1. baldr
    04.06.2024 15:29
    +1

    Ну, в целом, хороший пример пет-проекта, доведённого до определённого этапа, а не брошенный на версии 0.3alpha.

    Вопросы:
    - Почему ffmpeg, а не libav?
    - Почему управление ffmpeg через командную строку, а не через, например, PyAV?
    - Что если приложение громко упадёт, а ffmpeg не будет корректно завершён? Останется играть?


    1. Niamorro Автор
      04.06.2024 15:29

      Проект для меня на стадии бета, если людям будет интересно, я буду проводить оптимизации кода, и улучшать проект, про PyAV не знал, буду думать, возможно следующая версия будет использовать PyAV, FFmpeg завершается только после того как он закончит декодирование в pcm32, далее этот файл проигрывает PortAudio, проблема с FFmpeg может быть в том случае, если начать проигрывать большой файл 8+ часов


  1. fshp
    04.06.2024 15:29
    +2

    Недавно тоже делал плеер, но я использовал libav. Там из коробки можно стримы читать.

    А если эквалайзер не ставит целью научиться обрабатывать сигналы, то так же можно avfilter использовать.


  1. CitizenOfDreams
    04.06.2024 15:29

    Бесшовное воспроизведение умеет, без пауз между треками? А то автор AIMP'а уже почти 20 лет лепит отмазки, почему это невозможно сделать.


    1. ganzmavag
      04.06.2024 15:29

      В MP3 из-за особенностей стандарта нельзя, там изначально это не предусмотрели. Насколько знаю, там или кроссфейд, или пауза, или щелчок


  1. Emelian
    04.06.2024 15:29
    +4

    Мой проект — это простой аудиоплеер, и я хочу рассказать, как я его создавал, с какими сложностями столкнулся и что из этого вышло.

    Я вот сделал сложный медиа-плейер для ручного извлечения текста из аудио, видео и изображений с целью создания, например, собственных субтитров для обучающих видео.

    http://scholium.webservis.ru/Pics/MediaText.png

    Наверное, на эту тему тоже можно было бы написать статью, так как проектов подобного уровня на гитхабе и кодепроджект я не нашел. Тем более что эта штука оказалась весьма полезной в хозяйстве :) .


  1. Se6un
    04.06.2024 15:29

    Было интересно читать, спасибо


  1. Megabyte88
    04.06.2024 15:29

    В интерфейсе не хватает технической инфы по трекам: битрейт, частота, формат.