Как я могу воспроизвести mp3 с помощью pygame?

#python #tkinter #audio #pygame

#python #pygame

Вопрос:

 import pygame
file = 'some.mp3'
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(file)
pygame.mixer.music.play()
 

Выводится сообщение «Процесс завершен с кодом выхода 0», но он ничего не воспроизводит. Как я могу решить эту проблему?

Комментарии:

1. вы пробовали pygame.mixer.music.play(циклы =-1)???

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

3. while pygame.mixer.music.get_busy(): pygame.time.Clock().tick(10) что-то вроде этого решает мою проблему. я не знаю почему, но музыка занята.

4. Из pygame.org/docs/ref/music.html «Имейте в виду, что поддержка MP3 ограничена. […] Рассмотрите возможность использования OGG вместо этого «.

5. да, но это произошло, когда я попытался воспроизвести звук pygame.mixer.Sound(filename) Sound.play

Ответ №1:

Функция воспроизведения запускает воспроизведение музыки, но немедленно возвращается. Затем ваша программа достигает своего конца, и объект pygame автоматически уничтожается, что приводит к остановке музыки.

Как вы прокомментировали, он воспроизводит музыку, если вы подождете ее перед выходом — потому что тогда объект pygame не будет уничтожен до завершения цикла while.

 while pygame.mixer.music.get_busy(): 
    pygame.time.Clock().tick(10)
 

Ответ №2:

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

 while pygame.mixer.music.get_busy(): 
  pygame.time.Clock().tick(10)
 

однако еще лучше pygame.event.wait() , так как он будет ждать завершения всех асинхронных событий.

Ответ №3:

Вот очень простой способ.

 import pygame
file = 'some.mp3'
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(file)
pygame.mixer.music.play()
pygame.event.wait()
 

Ответ №4:

Я нашел хорошее решение из thepythongamebook.com:

 pygame.mixer.pre_init(44100, -16, 2, 2048) # setup mixer to avoid sound lag

pygame.init()

pygame.mixer.init()

pygame.mixer.music.load('music_01.mp3')

pygame.mixer.music.play(-1)
 

Ответ №5:

попробуйте это.

 import pygame

def pmusic(file):
    pygame.init()
    pygame.mixer.init()
    clock = pygame.time.Clock()
    pygame.mixer.music.load(file)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        print("Playing...")
        clock.tick(1000)

def stopmusic():
    pygame.mixer.music.stop()


def getmixerargs():
    pygame.mixer.init()
    freq, size, chan = pygame.mixer.get_init()
    return freq, size, chan


def initMixer():
    BUFFER = 3072  # audio buffer size, number of samples since pygame 1.8.
    FREQ, SIZE, CHAN = getmixerargs()
    pygame.mixer.init(FREQ, SIZE, CHAN, BUFFER)

try:
    initMixer()
    file = 'C:\data\03.mp3'
    pmusic(file)
except KeyboardInterrupt:  # to stop playing, press "ctrl-c"
    stopmusic()
    print("nPlay Stopped by user")
except Exception:
    print("unknown error")

print("Done")
 

Комментарии:

1. Добро пожаловать в StackOverflow. Ответы, содержащие только код, как правило, помечаются для удаления, поскольку они «низкого качества». Пожалуйста, прочтите раздел справки об ответах на вопросы, а затем рассмотрите возможность добавления некоторых комментариев к вашему ответу.

Ответ №6:

PyGame имеет 2 разных модуля для воспроизведения звука и музыки, модуль pygame.mixer и модуль pygame.mixer.music. Этот модуль содержит классы для загрузки звуковых объектов и управления воспроизведением. Разница объясняется в документации:

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

Если вы хотите воспроизвести файл mp3, вам необходимо инициализировать модуль. Загрузите файл с pygame.mixer.music.load помощью . Вызовите pygame.mixer.music.play() , чтобы начать воспроизведение музыкального потока. Наконец, вам нужно дождаться воспроизведения файла.
Используется pygame.mixer.music.get_busy() для проверки микширования звука. Запрашивайте состояние микшера непрерывно в цикле.
В цикле вам нужно отложить время на либо pygame.time.delay или pygame.time.Clock.tick . Кроме того, вам необходимо обрабатывать события в цикле приложения. Смотрите pygame.event.get() соответственно pygame.event.pump() :

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

 import pygame
pygame.init()

pygame.mixer.music.load('my_music.mp3')
pygame.mixer.music.play()

clock = pygame.time.Clock()
while pygame.mixer.music.get_busy():
    clock.tick(60)
    pygame.event.poll()
 

Ответ №7:

Кажется, звук не воспроизводится из-за того, как вы его импортировали. Приведенный ниже код воспроизводит звук, как и ожидалось. Здесь ничего не изменилось, кроме того, что вместо того, что import pygame он использует from pygame import mixer . Это может быть связано с тем, что Pygame — это пакет, но я не уверен.

 from pygame import mixer

file = 'some.mp3'
mixer.init()
mixer.music.load(file)
mixer.music.play()