PyQt6 如何用滑块设置音量
我无法通过滑块来调整正在播放的音乐音量。
我试着用audio_output来改变音量,但没有成功。
import sys
from PyQt6.QtCore import Qt, QUrl
from PyQt6.QtMultimedia import QMediaPlayer, QAudioOutput
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QSlider, QVBoxLayout, QHBoxLayout, QLabel
class MusicPlayer(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Музыкальный плеер")
self.setGeometry(100, 100, 400, 200)
self.initUI()
self.initPlayer()
def initPlayer(self):
self.player = QMediaPlayer()
self.audio_output = QAudioOutput()
self.player.setAudioOutput(self.audio_output)
file_name = "song.mp3"
self.player.setSource(QUrl.fromLocalFile(file_name))
self.audio_output.setVolume(50)
self.player.play()
def initUI(self):
self.play_button = QPushButton("Play")
self.play_button.clicked.connect(self.play_music)
self.pause_button = QPushButton("Pause")
self.pause_button.clicked.connect(self.pause_music)
self.stop_button = QPushButton("Stop")
self.stop_button.clicked.connect(self.stop_music)
self.volume_slider = QSlider(Qt.Orientation.Horizontal)
self.volume_slider.setValue(50)
self.volume_slider.setMaximum(100)
self.volume_slider.setToolTip("Volume")
self.volume_slider.valueChanged.connect(self.set_volume)
self.track_label = QLabel("Название трека")
vbox = QVBoxLayout()
hbox = QHBoxLayout()
hbox.addWidget(self.play_button)
hbox.addWidget(self.pause_button)
hbox.addWidget(self.stop_button)
hbox.addWidget(self.volume_slider)
vbox.addWidget(self.track_label)
vbox.addLayout(hbox)
self.setLayout(vbox)
def play_music(self):
self.player.play()
def pause_music(self):
self.player.pause()
def stop_music(self):
self.player.stop()
def set_volume(self):
self.volume = self.volume_slider.value()
print(self.volume)
print(type(self.volume))
self.audio_output.setVolume(self.volume)
app = QApplication(sys.argv)
playerM = MusicPlayer()
playerM.show()
sys.exit(app.exec())
2 个回答
1
抱歉,我使用的是 PyQt5。
请先设置好你的导入,然后试试下面的代码:
import sys
'''
from PyQt6.QtCore import Qt, QUrl
from PyQt6.QtMultimedia import QMediaPlayer, QAudioOutput
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QSlider, QVBoxLayout, QHBoxLayout, QLabel
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.Qt import *
class MusicPlayer(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Музыкальный плеер")
self.setGeometry(100, 100, 400, 200)
self.initUI()
self.initPlayer()
def initPlayer(self):
self.player = QMediaPlayer()
# self.audio_output = QAudioOutput()
# self.player.setAudioOutput(self.audio_output)
# self.player.setSource(QUrl.fromLocalFile(file_name))
# self.audio_output.setVolume(50)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
file_name = "sounds/zvuki_prirody.mp3" # "song.mp3" eустановите свое
file = QUrl.fromLocalFile(file_name)
self.content = QMediaContent(file)
self.player.setMedia(self.content)
self.player.setVolume(50.0)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
self.player.play()
def initUI(self):
self.play_button = QPushButton("Play")
self.play_button.clicked.connect(self.play_music)
self.pause_button = QPushButton("Pause")
self.pause_button.clicked.connect(self.pause_music)
self.stop_button = QPushButton("Stop")
self.stop_button.clicked.connect(self.stop_music)
self.volume_slider = QSlider(Qt.Orientation.Horizontal)
self.volume_slider.setValue(50)
self.volume_slider.setMaximum(100)
self.volume_slider.setToolTip("Volume")
self.volume_slider.valueChanged.connect(self.set_volume)
self.track_label = QLabel("Название трека")
vbox = QVBoxLayout()
hbox = QHBoxLayout()
hbox.addWidget(self.play_button)
hbox.addWidget(self.pause_button)
hbox.addWidget(self.stop_button)
hbox.addWidget(self.volume_slider)
vbox.addWidget(self.track_label)
vbox.addLayout(hbox)
self.setLayout(vbox)
def play_music(self):
self.player.play()
def pause_music(self):
self.player.pause()
def stop_music(self):
self.player.stop()
# ---------------------> vvvvvv <----------------------------------------------
def set_volume(self, volume):
# self.volume = self.volume_slider.value()
# self.audio_output.setVolume(self.volume)
self.player.setVolume(volume) # +++ volume
if __name__ == "__main__":
app = QApplication(sys.argv)
playerM = MusicPlayer()
playerM.show()
sys.exit(app.exec())
3
QAudioOutput的volume
属性的说明写得很清楚:
音量是线性变化的,范围从0(静音)到1(最大音量)。
这意味着你需要相应地调整范围:如果你想要的音量范围是0到100,那么你需要把这个值除以100。
因为乘法通常比除法快,所以对于这种简单的比例,通常更推荐用0.01(1/100)来乘。
class MusicPlayer(QWidget):
...
def initPlayer(self):
...
self.audio_output.setVolume(.5) # 50 / 100
...
def set_volume(self):
self.volume = self.volume_slider.value()
self.audio_output.setVolume(self.volume * .01)
文档还提到,音量的值是线性的,但人类对音量的感知是对数的,所以你应该考虑使用静态的QAudio.convertVolume()
:
from PyQt6.QtMultimedia import QMediaPlayer, QAudioOutput, QAudio
...
class MusicPlayer(QWidget):
...
def real_volume(self, slider_value):
return QAudio.convertVolume(
slider_value * .01,
QAudio.VolumeScale.LogarithmicVolumeScale,
QAudio.VolumeScale.LinearVolumeScale
)
def initPlayer(self):
...
self.audio_output.setVolume(self.real_volume(50))
def set_volume(self):
self.volume = self.volume_slider.value()
self.audio_output.setVolume(self.real_volume(self.volume))