Как извлечь длину аудиофайла с помощью PyQt 5?
Раньше я определял длину аудиофайла таким способом:
import datetime, mutagen
path = 'C:/Users/User/Desktop/music/13.Numb.mp3'
audiofile = mutagen.File(path)
length = str(datetime.timedelta(seconds = audiofile.info.length))
print(length)
После этого цифры пишутся в базу данных.
Код действительно работает, но, когда мне потребовалось задействовать эту информацию в своем приложении, возникли проблемы.
Первая проблема:
Мое приложение воспроизводит музыкальные композиции. Чтобы определить, сколько секунд уже воспроизвелось, а сколько секунд осталось воспроизвести, я определяю длительность источника звука в QMediaPlayer. Очень упрощенно вывод продолжительности источника выглядит так:
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
import time
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.play_pause = True
self.song = 'C:/Users/User/Desktop/music/13.Numb.mp3'
self.player = QtMultimedia.QMediaPlayer()
box = QtWidgets.QVBoxLayout(self)
play_btn = QtWidgets.QPushButton('Play', clicked = self.play)
box.addWidget(play_btn)
self.length = QtWidgets.QLabel('Length - 00:00', alignment = QtCore.Qt.AlignCenter)
box.addWidget(self.length)
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.play_mode)
self.timer.start(1000)
def play(self):
if self.play_pause == True:
self.play_pause = False
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(self.song)))
self.player.play()
def play_mode(self):
if self.play_pause == False:
self.length.setText(time.strftime('%M:%S', time.localtime(self.player.duration() / 1000)))
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
Как оказалось данные в первом и втором коде разнятся. Иногда разница может достигать нескольких секунд. Для меня это довольно существенно, поэтому хотелось бы сразу определять и сохранять длину трека посредством Qt. К сожалению я не знаю, как это сделать, не добавляя аудиофайл в QMediaPlayer.
Вторая проблема:
Сейчас длина сохраняется в четырех цифрах. Две цифры выделяются на минуты, две другие выделяются на секунды. Выглядит это примерно так: 00:00
Практически любая песня не достигает десяти минут. Т.е. в большинстве случаев нет необходимости во второй цифре в разделе минут. Я бы хотел, обрезать первый нолик, если в четвертой цифре нет необходимости. Т.е. иногда строка должна выглядить так: 0:00.
Пожалуйста, подскажите, как мне это сделать?
Ответы (1 шт):
Вам не нужны никакие таймеры и time
QMediaPlayer::durationChanged(qint64 duration)
Сигнал длительности контента изменился на длительность, выраженную в миллисекундах.
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.play_pause = True
self.song = 'D:/_Qt/__Qt/sound/sound_ringtimer.mp3'
self.player = QtMultimedia.QMediaPlayer()
box = QtWidgets.QVBoxLayout(self)
play_btn = QtWidgets.QPushButton('Play', clicked = self.play)
box.addWidget(play_btn)
self.length = QtWidgets.QLabel('Length - ', alignment = QtCore.Qt.AlignCenter)
box.addWidget(self.length)
def play(self):
if self.play_pause == True:
self.play_pause = False
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(self.song)))
self.player.durationChanged.connect(self.time_duration) # +++
self.player.play()
# self.player.setVolume(0.0) # убрать звук, если надо
def time_duration(self, d):
self.player.stop() # +++ Останавливает воспроизведение медиа.
m = d // 1000 // 60
s = d // 1000 % 60
self.length.setText(f'Length - {m:>1}:{s:0>2}') # +++ форматируем строку вывода
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
