Как я создавал аудиоплеер на python с FFmpeg
Всех приветствую. Сегодня хочу поделиться опытом создания своего первого проекта на 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
, аудиоплеер имеет современный и стильный интерфейс.
Планы на будущее
Добавить поддержку потокового аудио: Возможность воспроизводить музыку из интернет-радиостанций и стриминговых сервисов.
Расширить функциональность плейлиста: Добавить возможность создания и сохранения пользовательских плейлистов.
Поддержка эквалайзера: Добавить эквалайзер для настройки звука.
Заключение
Создание аудиоплеера на Python оказалось полезным опытом. Я научился работать с аудио на низком уровне, обрабатывать потоки и создавать пользовательский интерфейс.
Буду рад любым отзывам и предложениям по улучшению плеера. Спасибо за внимание!
Ссылки:
Сайт проекта с загрузкой пакетов