def loopregionplayer(self):#选区循环播放,暂时连接在stop按钮
self.loop_position.setRegion((0, 0))
self.ui.graph.plotItem.getViewBox().addItem(self.loop_position)
# self.audio_play.setPosition(1000)#设置开始时间(毫秒)
# self.audio_play.positionChanged()
# time.sleep(2)
# self.audio_play.positionChanged()
self.ui.slider.blockSignals(True)
self.ui.slider.setValue(1000)
self.ui.slider.blockSignals(False)
# print(self.audio_play.position())
# time.sleep(3)
self.audio_play.play()
while True:
print(self.audio_play.position())
self.update_timestamp(self.audio_play.position(), self.ui.current_time, self.ui.slider)
self.loop_position.setRegion((self.ui.slider.value()/1000, self.ui.slider.value()/1000))
if self.ui.slider.value()>=5001:#终止判断条件
self.audio_play.pause()
break
# self.ui.slider.setValue(self.audio_play.position())
print(self.ui.slider.value())
slider.value()和audio_play.position()的值都会更新但是进度条不会刷新
暂时没有解决办法
怎样在实现这个功能的基础上让进度条实现更新
完整代码如下
ui部分
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(782, 657)
MainWindow.setMaximumSize(QtCore.QSize(800, 16777215))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.graph = PlotWidget(self.centralwidget)
self.graph.setObjectName("graph")
self.gridLayout.addWidget(self.graph, 0, 0, 1, 11)
self.play_speed = QtWidgets.QComboBox(self.centralwidget)
self.play_speed.setMaximumSize(QtCore.QSize(50, 20))
self.play_speed.setEditable(False)
self.play_speed.setObjectName("play_speed")
self.play_speed.addItem("")
self.play_speed.addItem("")
self.play_speed.addItem("")
self.play_speed.addItem("")
self.play_speed.addItem("")
self.play_speed.addItem("")
self.gridLayout.addWidget(self.play_speed, 1, 10, 1, 1)
self.current_time = QtWidgets.QLabel(self.centralwidget)
self.current_time.setObjectName("current_time")
self.gridLayout.addWidget(self.current_time, 1, 2, 1, 1)
self.slider = QtWidgets.QSlider(self.centralwidget)
self.slider.setOrientation(QtCore.Qt.Horizontal)
self.slider.setObjectName("slider")
self.gridLayout.addWidget(self.slider, 1, 3, 1, 1)
self.stop = QtWidgets.QPushButton(self.centralwidget)
self.stop.setMaximumSize(QtCore.QSize(50, 16777215))
self.stop.setObjectName("stop")
self.gridLayout.addWidget(self.stop, 2, 6, 1, 1)
self.play = QtWidgets.QPushButton(self.centralwidget)
self.play.setMaximumSize(QtCore.QSize(50, 16777215))
self.play.setObjectName("play")
self.gridLayout.addWidget(self.play, 2, 5, 1, 1)
self.pause = QtWidgets.QPushButton(self.centralwidget)
self.pause.setMaximumSize(QtCore.QSize(50, 16777215))
self.pause.setObjectName("pause")
self.gridLayout.addWidget(self.pause, 2, 4, 1, 1)
self.total_time = QtWidgets.QLabel(self.centralwidget)
self.total_time.setObjectName("total_time")
self.gridLayout.addWidget(self.total_time, 1, 4, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menuBar = QtWidgets.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 782, 23))
self.menuBar.setObjectName("menuBar")
self.menu = QtWidgets.QMenu(self.menuBar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menuBar)
self.actionopen = QtWidgets.QAction(MainWindow)
self.actionopen.setObjectName("actionopen")
self.menu.addAction(self.actionopen)
self.menuBar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
self.play_speed.setCurrentIndex(2)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.play_speed.setCurrentText(_translate("MainWindow", "x1.0"))
self.play_speed.setItemText(0, _translate("MainWindow", "x0.5"))
self.play_speed.setItemText(1, _translate("MainWindow", "x0.75"))
self.play_speed.setItemText(2, _translate("MainWindow", "x1.0"))
self.play_speed.setItemText(3, _translate("MainWindow", "x1.25"))
self.play_speed.setItemText(4, _translate("MainWindow", "x1.5"))
self.play_speed.setItemText(5, _translate("MainWindow", "x2.0"))
self.current_time.setText(_translate("MainWindow", "0:00"))
self.stop.setText(_translate("MainWindow", "stop"))
self.play.setText(_translate("MainWindow", "play"))
self.pause.setText(_translate("MainWindow", "pause"))
self.total_time.setText(_translate("MainWindow", "0:00"))
self.menu.setTitle(_translate("MainWindow", "文件"))
self.actionopen.setText(_translate("MainWindow", "open"))
from pyqtgraph import PlotWidget
功能部分
import sys, os, shutil
import matplotlib.pyplot as plt
from librosa.core.spectrum import _spectrogram
import numpy as np
import pyqtgraph as pg
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from datetime import datetime
import pyqtgraph
import pyqtgraph.exporters
import matplotlib.pyplot as plt
from MainWindow import Ui_MainWindow
import scipy.io.wavfile
import librosa.display
import time
def time_stamp(ms):
hours, remainder = divmod(ms, 3_600_000)
minutes, remainder = divmod(remainder, 60_000)
seconds, _ = divmod(remainder, 1_000)
return ("%d:%02d:%02d" % (hours, minutes, seconds)) if hours else ("%d:%02d" % (minutes, seconds))
class MainWindow(qtw.QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.show()
self.samples = None
self.sampling_rate = None
self.samples_after = None
self.data_line = None
self.playback_position = None
self.loop_position = pyqtgraph.LinearRegionItem(values=(0, 0))
self.position=0
self.audio_play = QMediaPlayer()
self.player = QMediaPlayer()
self.audio_play.setNotifyInterval(1)
self.ui.actionopen.triggered.connect(self.open_audio)
self.ui.play.clicked.connect(self.audio_play.play)
self.ui.pause.clicked.connect(self.audio_play.pause)
self.ui.stop.clicked.connect(self.loopregionplayer)#暂时测试功能
self.audio_play.durationChanged.connect(lambda duration: self.update_duration(duration))
self.ui.play_speed.currentIndexChanged.connect(lambda: self.audio_play.setPlaybackRate(float(self.ui.play_speed.currentText()[1:])))
def open_audio(self):
path = qtw.QFileDialog.getOpenFileName(None, 'Load Audio', './', "Audio File(*.wav)")[0]
print(path)
self.audio_play.setMedia(QMediaContent(qtc.QUrl.fromLocalFile(path)))
self.audio_play.positionChanged.connect(lambda position: self.update_timestamp(position,self.ui.current_time, self.ui.slider))
# # self.audio_play.positionChanged.connect(self.PC)
self.ui.slider.valueChanged.connect(self.audio_play.setPosition)
self.sampling_rate, self.samples = scipy.io.wavfile.read(path)
self.plot_graph(self.samples, self.sampling_rate)
def PC(self):#更新位置和当前显示时间
return self.update_timestamp(self.audio_play.position(), self.ui.current_time, self.ui.slider)
def plot_graph(self, samples, sampling_rate):#画图
peak_value = np.amax(samples)
normalized_data = samples / peak_value
length = samples.shape[0] / sampling_rate
time = list(np.linspace(0, length, samples.shape[0]))
drawing_pen = pg.mkPen(color=(255, 0, 0), width=0.5)
self.ui.graph.removeItem(self.data_line)
self.data_line = self.ui.graph.plot(
time, normalized_data, pen=drawing_pen)
self.ui.graph.plotItem.setLabel(axis='left', text='Normalized Amplitude')
self.ui.graph.plotItem.setLabel(axis='bottom', text='time [s]')
self.ui.graph.plotItem.getViewBox().setLimits(xMin=0, xMax=np.max(time), yMin=-1.1, yMax=1.1)
self.playback_position = pyqtgraph.LinearRegionItem(values=(0, 0))
self.ui.graph.plotItem.getViewBox().addItem(self.playback_position)
def update_timestamp(self, position,currentTimeLabel, timeSlider):#更新进度条
if position >= 0:
currentTimeLabel.setText(time_stamp(position))
timeSlider.blockSignals(True)
timeSlider.setValue(position)
timeSlider.blockSignals(False)
self.playback_position.setRegion((position/1000, position/1000))
minRange, maxRange = self.ui.graph.plotItem.getAxis('bottom').range
# if(position >= maxRange * 1000):
# self.ui.graph.plotItem.getViewBox().translateBy((maxRange-minRange), 0)
# #self.synchronize()
# if(position <= minRange * 1000):
# self.ui.graph.plotItem.getViewBox().translateBy(-minRange)
# #self.synchronize()
def update_duration(self, duration ):#更新总时长
self.ui.slider.setMaximum(duration)
if duration >= 0:
self.ui.total_time.setText(time_stamp(duration))
def loopregionplayer(self):#选区循环播放,暂时连接在stop按钮
self.loop_position.setRegion((0, 0))
self.ui.graph.plotItem.getViewBox().addItem(self.loop_position)
# self.audio_play.setPosition(1000)#设置开始时间(毫秒)
# self.audio_play.positionChanged()
# time.sleep(2)
# self.audio_play.positionChanged()
self.ui.slider.blockSignals(True)
self.ui.slider.setValue(1000)
self.ui.slider.blockSignals(False)
# print(self.audio_play.position())
# time.sleep(3)
self.audio_play.play()
while True:
print(self.audio_play.position())
self.update_timestamp(self.audio_play.position(), self.ui.current_time, self.ui.slider)
self.loop_position.setRegion((self.ui.slider.value()/1000, self.ui.slider.value()/1000))
if self.ui.slider.value()>=5001:#终止判断条件
self.audio_play.pause()
break
# self.ui.slider.setValue(self.audio_play.position())
print(self.ui.slider.value())
if __name__ == '__main__':
app = qtw.QApplication(sys.argv)
app.setStyle("Fusion")
mw = MainWindow()
sys.exit(app.exec_())