Изменение громкости в pygame.mixer (почти) не влияет
Я пытаюсь создать приложение в tkinter, в котором есть несколько кнопок, на которые можно назначить звук и воспроизвести его позже. Само нажатие кнопки вызывает только метод play(), поэтому загрузка звука производится заранее.
Я попытался сделать какое-то регулирование громкости с помощью ползунков (tk.Scale), и я заметил, что между большинством значений громкости нет заметной разницы, пока я не достигну очень близкого к нулю (принимая во внимание, что разрешение слайдера составляет 0,01 от 0,0 до 0,1). Примерно в 0,02, я думаю, я заметил, что громкость звука значительно ниже, и если я достигну нуля, звук будет отключен. Обратите внимание, что это происходит, если я перемещаю ползунок, пока не воспроизводятся звуки.
Интересно, что если я попытаюсь воспроизвести звук, достаточно длинный, чтобы позволить мне переместить ползунок во время его воспроизведения, я сразу почувствую разницу, но если звук перестанет играть, и я попробую воспроизвести его снова, он перейдет к громкость по умолчанию снова.
Так как я разделил свое приложение на несколько сценариев в соответствии с тем, что они делают (запись звука, воспроизведение звука, графический интерфейс), я подумал, что это может быть проблемой из-за того, что я непосредственно не инициализировал микшер Pygame, а скорее из импортированного модуля, поэтому я сделал новый скрипт Python и набрал этот код в:
import pygame
import time
pygame.mixer.pre_init(frequency=44100, size=-16, channels=1, buffer=512)
pygame.mixer.init()
sound1=pygame.mixer.Sound("sound.wav")
sound1.set_volume(1.0)
print sound1.get_volume()
sound1.play()
time.sleep(sound1.get_length())
sound1.set_volume(0.5)
print sound1.get_volume()
sound1.play()
time.sleep(sound1.get_length())
sound1.set_volume(0.08)
print sound1.get_volume()
sound1.play()
time.sleep(sound1.get_length())
Вывод следующий: 1.0,0.5,0.078125 (один под другим), подтверждающий, что громкость действительно установлена (надеюсь, правильно).
Единственный раз, когда я могу заметить разницу, это третий случай, который на самом деле не так заметен, я хочу, чтобы увеличение громкости было линейным, это далеко не так.
Я попробовал то же самое с каналом:
sound1=pygame.mixer.Sound("sound.wav")
channel=pygame.mixer.find_channel(True)
channel.set_volume(1.0)
channel.play(sound1)
time.sleep(sound1.get_length()/2)
channel.set_volume(0.5)
print "Volume set"
time.sleep(sound1.get_length()/2)
Не повезло, то же самое происходит и здесь.
Я потратил весь день, прибегая к помощи "проблемы с объемом микшера Pygame", "проблемы с громкостью микшера Pygame" и подобных фраз, но не повезло. Надеюсь, кто-то здесь может помочь, учитывая, что мой диплом зависит от метода Python.:)
Заранее спасибо.
4 ответа
Я нашел ответ (спасибо Gummbum из PyGame IRC).
Проблема не в Python или Pygame, а скорее в Windows. Кажется, что улучшения звука каким-то образом влияют на то, как воспроизводится мой сценарий (или любой другой сценарий Pygame).
Я на Windows 10, и вот как я это сделал:
Щелкните правой кнопкой мыши значок динамика на панели задач
Выберите устройства воспроизведения
- Выберите колонки и свойства
- Перейдите на вкладку "Улучшения" и снимите флажки "Эквалайзер и Эквалайзер громкости".
Вот и все.
Музыка на Raspberry Pi: используя Pygame для программирования воспроизведения музыки на моем Raspberry Pi, я обнаружил, что громкость слишком низкая при настройках от 0,0 до 1,0. Затем я попытался установить значение выше до 10.0(pygame.mixer.music.set_volume(vol)), и это работает Отлично!
Возможно, вам нужно изменить формат файла на mp3 для воспроизведения музыки, потому что, когда я скопировал этот код, получил музыку с будильником в расширении mp3 и запустил его в Spyder(anaconda) python 3.8, он работает, может быть 2 решения:
- Измените версию Python на 3.8
- Преобразуйте расширение .wav в mp3
Я не уверен, что это сработает или нет, но в этих ситуациях это может сработать с вашей стороны.
Для меня это работает, но не линейно, по крайней мере, для человеческого уха. 1 - это максимум, 0,2 - половина объема и т. Д.