Вопрос или проблема
Мне нужно иметь возможность воспроизводить короткие (<3с) звуки из блобов, закодированных в mp3, хранящихся в базе данных sqlite3.
В настоящее время я работаю под Linux, но кроссплатформенное решение было бы приветствовано.
Мне не нужно контролировать звук (т.е. не нужно останавливать, ставить на паузу и т.д.), но я должен знать, когда звук закончился; подходящей была бы функция, принимающая блоб в памяти и возвращающая, когда воспроизведение завершено.
Я также не хочу, чтобы открывались окна (это должно работать из командной строки).
Я не хочу записывать блоб в файл, и это, похоже, исключает такие вещи, как pygame
и playsound
.
Буду признателен за помощь.
Ответ или решение
Для воспроизведения коротких звуков из mp3-блобов, хранящихся в SQLite3 базе данных, предлагаю подход на основе библиотеки pydub
в сочетании с simpleaudio
. Это решение подходит для использования в средах Linux и является кроссплатформенным. С помощью этого подхода вы сможете избежать открытия окон и не будете сохранять блобы в файлы, что соответствует вашим требованиям.
Установка необходимых библиотек
Перед началом работы убедитесь, что у вас установлены необходимые библиотеки. Используйте команды:
pip install pydub simpleaudio
sudo apt-get install ffmpeg # для работы с mp3
Пример кода
Вот пример функции, которая принимает mp3-блоб, загружает его в память и воспроизводит звук. Функция будет блокирующей, что означает, что она завершится только после окончания воспроизведения звука.
import sqlite3
from pydub import AudioSegment
import simpleaudio as sa
import io
def play_sound_from_blob(blob):
# Загрузка mp3 из blob
audio_segment = AudioSegment.from_file(io.BytesIO(blob), format='mp3')
# Преобразование в формат, подходящий для воспроизведения
playback = audio_segment.raw_data
sample_rate = audio_segment.frame_rate
num_channels = audio_segment.channels
sample_width = audio_segment.sample_width
# Создание объекта Wave для воспроизведения
audio = sa.WaveObject(playback, num_channels, sample_width, sample_rate)
# Воспроизведение
play_sound = audio.play()
play_sound.wait_done() # Дождаться завершения воспроизведения
# Пример использования
def get_blob_from_db(db_path, sound_id):
# Открытие базы данных и извлечение blob звука
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute("SELECT sound_blob FROM sounds WHERE id=?", (sound_id,))
blob = cursor.fetchone()[0]
conn.close()
return blob
# Используйте указанные функции для воспроизведения звука
if __name__ == "__main__":
db_path = 'sounds.db' # Путь к вашей базе данных
sound_id = 1 # ID звука, который хотите воспроизвести
sound_blob = get_blob_from_db(db_path, sound_id)
play_sound_from_blob(sound_blob)
Объяснение кода
-
Импорт необходимых библиотек: Мы используем
sqlite3
для работы с базой данных,pydub
для обработки mp3-звуков иsimpleaudio
для воспроизведения аудио. -
Функция
play_sound_from_blob
:- Принимает блоб аудио в формате mp3.
- Загружает его с помощью
pydub
в память. - Преобразует его в формат, необходимый для
simpleaudio
. - Воспроизводит звук и блокирует выполнение программы до завершения воспроизведения.
-
Функция
get_blob_from_db
:- Устанавливает соединение с базой данных SQLite.
- Извлекает блоб аудиофайла по ID.
- Закрывает подключение к базе данных после получения блоба.
Заключение
Это решение позволяет вам эффективно воспроизводить короткие звуки из блобов в базе данных без создания временных файлов или графического интерфейса. Благодаря использованию pydub
и simpleaudio
вы получите кроссплатформенное решение, соответствующее вашим требованиям. Если у вас возникнут вопросы или проблемы, не стесняйтесь обращаться за помощью.