Воспроизведение аудио файлов с Python

39

Я ищу хорошо поддерживаемую библиотеку Python, позволяющую воспроизводить аудиофайлы на моем Raspberry Pi с использованием стандартного аудиовыхода.

Пока я пробовал несколько, но ни один из них, кажется, не работает. Хотя pyglet работает на моем обычном компьютере нормально, он вызывает ошибку на Raspberry Pi. Есть ли библиотека Python, которая доказала свою простоту использования?

глиняная пивная кружка
источник
Доказано, что он прост в использовании, но относителен, но я разместил альтернативу pygame аналогичному вопросу на StackOverflow здесь . По сути, это альтернатива vlc.py (модуль Python libVLC, который очень хорошо поддерживается).
Бен
Еще один вопрос говорит о том, что Pyglet работает над RPi. Вы можете обновить с вашей ошибкой?
Брайан Булковски

Ответы:

32

Я рекомендую широко популярную игру Pygame. Я могу ошибаться, но я считаю, что он предустановлен на Pi. Вы можете использовать музыкальный модуль Pygame Mixer для воспроизведения аудиофайлов. Я включил пример кода ниже.

Предполагая, что у нас есть аудиофайл под названием myFile.wav.

import pygame
pygame.mixer.init()
pygame.mixer.music.load("myFile.wav")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy() == True:
    continue

ПРИМЕЧАНИЕ. Если это не помогло, перейдите в терминал и обновите систему

apt-get update
apt-get upgrade

и попробуй еще раз.

xxmbabanexx
источник
2
Если у вас есть более одного звука для воспроизведения (что вполне вероятно), тогда лучше создать объект pygame.mixer.Sound для каждого из них, тогда вы можете хранить определения имен файлов звуков в одном месте.
Фрэнсис
Это то, что я хочу, но у моей материнской платы нет драйвера, поэтому я использую звуковую карту USB. Играет espeakпросто отлично, но не это.
SDsolar
11

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

Я не думаю, что это особенно элегантно, но я открыл канал для фонового процесса MPlayer.

import subprocess
player = subprocess.Popen(["mplayer", "song.mp3", "-ss", "30"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Затем, когда я захотел завершить процесс MPlayer, я просто написал «q» для выхода в канал.

player.stdin.write("q")

Посмотрите в документации MPlayer все виды команд, которые вы можете передать таким образом, чтобы управлять воспроизведением.

Надеюсь, это несколько полезно!

user1616681
источник
1
Это действительно аккуратно на самом деле. В этом уроке по adafruit рассказывается о воспроизведении звука, но не о его остановке.
Гидеон
6

Другой вариант - использовать mpg321и вызывать его из командной строки.

apt-get install mpg321

Тогда в Python:

import os

os.system('mpg321 foo.mp3 &')

Pygame почти наверняка более устойчив, но, я полагаю, зависит от ваших потребностей.

Брандорф
источник
1
Я думал об этом сам, но думал, что это не очень элегантно, потому что это делает паузу, регулировку громкости и т.д. намного сложнее.
Штайн
Это ужасно медленно.
Алекс
3

Я бы порекомендовал pyglet, а не pygame, если вам не нужна графика. На мой взгляд, это проще, элегантнее и лучше поддерживается. Опять же, я ожидаю, что это может быть дело вкуса.

Бекс
источник
1
Так как ты это используешь?
SDsolar
Кажется, что pyglet запускается только при наличии дисплея; запускать его удаленно или в качестве демона только для воспроизведения звуков не работает.
oh7lzb
0

Pygame дает вам простой и удобный способ загружать и воспроизводить звуки на разных каналах.

mrpi64
источник
0

Вы можете использовать несколько внешних игроков через каналы. Тем не менее, вы почти всегда будете испытывать потерю скорости. Существует также проблема с управлением воспроизведением.

Я рекомендую вам pyaudio, он отлично работает.

Если вы хотите воспроизвести и сжатые файлы, я могу свободно указать вам на мой модуль decoder.py. Вы можете найти это на PyPI.

Он также использует подпроцесс, но вызывает декодеры вместо игроков. Они не используют много процессора, и некоторые из них знают, как использовать аппаратное ускорение. Затем вы можете использовать pyaudio или что-то еще для вывода необработанных аудиоданных. Если вы хотите, вы можете даже использовать pygame, используя pygame.sndarray. Таким образом, вы можете воспроизводить больше форматов, чем поддерживает Pygame.

Я пробовал decoder.py в среде PyQT GUI, с pyaudio, а также используя aplay в качестве внешнего проигрывателя. Это было на Raspberry Pi B.

Результаты были довольно удовлетворительными в обоих случаях.

Простота может быть поставлена ​​под сомнение.

Сам по себе decoder.py очень прост, но вы должны комбинировать его с другими библиотеками, и это увеличивает количество строк кода.

Есть пример того, как проигрывать файлы, включенные в файл decoder.py.

Дален
источник
0

Я использую OSMC (Debian) и получил звук для воспроизведения через динамики телевизора, которые подключены через HDMI. https://youtu.be/p2ljmTE67gs

Мой метод был основан на вышеупомянутом решении, опубликованном @xxmbabanexx, а также здесь . В основном я должен был добавить dtparam=audio=onк/boot/config.txt

jjinking
источник
Я думаю, что TS имел в виду разъем 3,5 мм применительно к «стандартному аудиовыходу». Работает ли это также и для разъема 3,5?
Бекс
А ну понятно. Хм, вероятно, не будет, хотя я не пробовал.
jjinking