Pygame не воспроизводит файлы mp3, помеченные мутагеном

После пометки аудиофайла с помощью mutagen pygame больше не может воспроизводить файл. Однако он успешно загружает файл, и вызов pygame.mixer.music.play() не вызывает ошибки. На самом деле я использую библиотеку music-tag, которая является просто оболочкой вокруг mutagen для пометки файлов. Было интересно, если это известная проблема.

Код для тегов

import music_tag

f = music_tag.load_file('sample.mp3')
f['title'] = 'Smells like teen spirit'
f['artwork'] = open('nirvana.jpg', 'rb').read()
f.save()

Код для воспроизведения

from pygame import mixer
mixer.init()

mixer.music.load('sample.mp3') 

mixer.music.set_volume(0.7) 
mixer.music.play(-1) 

while True:
    query = input()
    if query == 'q':
        mixer.music.stop()
        break;

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


person droptop    schedule 01.10.2020    source источник
comment
на вашем месте я бы не перезаписывал тот же файл, который вы читали. Попробуйте изменить это в первую очередь. Попробуйте также воспроизвести файл с тегами на любом mp3-плеере.   -  person Walter Tross    schedule 01.10.2020
comment
Кстати, в примере здесь используется with open(..., что приводит к повторному закрытию файла изображения — что-то, что вы не делаете, но должны делать   -  person Walter Tross    schedule 01.10.2020
comment
@WalterTross Спасибо за предложения. Воспроизведение песни с тегами на других mp3-плеерах, таких как vlc и totem, работает. И проблема, кажется, не в том, как файл открывается. Также я не понимаю, что вы имеете в виду, говоря, что не перезаписываете один и тот же файл.   -  person droptop    schedule 02.10.2020
comment
ну, я думаю, f.save() перезаписывает тот же файл, который был прочитан ранее. В целом это плохая идея, хотя я заметил (после написания своего комментария), что пример в доке делает то же самое.   -  person Walter Tross    schedule 02.10.2020
comment
@WalterTross Я понятия не имею, как не перезаписывать один и тот же файл   -  person droptop    schedule 02.10.2020
comment
как обычно документация отстой. Строка должна быть этой, поэтому все, что вам нужно сделать, это f.save('tagged_sample.mp3'). Обратите внимание на комментарий к следующей строке...   -  person Walter Tross    schedule 03.10.2020


Ответы (1)


input () блокирует все приложение до тех пор, пока не будет сделан ввод. Используйте событие KEYDOWN для определения нажатия q (см. также Проблема при использовании клавиатурных команд в pygame):

from pygame import mixer
mixer.init()

mixer.music.load('sample.mp3') 
mixer.music.set_volume(0.7) 
mixer.music.play(-1) 

run = True
while run:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                mixer.music.stop()
                run = False
person Rabbid76    schedule 20.12.2020