Как отключить звуковой сигнал, появляющийся перед воспроизведением музыкальной композиции?(Python 3, PyQt 5)
Мой небольшой код создает кнопку play_btn на главном окне приложения. Эта кнопка связана с методом play_song() класса MyWindow. Метод play_song() задает проигрывателю источник для воспроизведения. В данном случае источником является первый элемент списка self.list, в которым хранятся пути к mp3-файлам.
Клик на кнопку play_btn действительно запускает проигрывание композиции, но перед этим появляется котороткий электронный звук. Этот звук не зависит от аудиофайла, который будет проигрываться. Как я понял, он не является багом и появляется специально, возможно, для оповещения пользователя о начале проигрывания. Мне бы очень хотелось отключить его. Есть ли способ сделать это?
UPD:
Я забыл сказать, что звук появляется не перед любым mp3-файлом. Есть песни, которые начинают воспроизводиться молча. Я не думаю, что некоторые из них могут быть бракованными. В других проигрывателях все из них читаются хорошо. Наверное, это делу не поможет, но нужно добавить, что большинство mp3-файлов посредством модуля PyQt 5 у меня отказывались воспроизводиться, но были и те, что воспроизводились. Тогда я установил какой-то пак кодеков K-Lite, ситуация поправилась(моя операционная система - Windows 10, самая обычная сборка). Так вот, файлы, которым были необходимы кодеки, проигрываются без этого звука. Файлы, которые воспроизводились без кодеков, вызывают перед проигрыванием этот электронный звук.
from PyQt5 import QtCore, QtWidgets, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# self.list = ['8.Figure09.mp3', '13.Numb.mp3']
self.list = ['bibi.mp3', 'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3']
self.player = QtMultimedia.QMediaPlayer()
self.box = QtWidgets.QGridLayout(self)
play_btn = QtWidgets.QPushButton('Play', clicked = self.play_song)
self.box.addWidget(play_btn, 0, 0)
# Воспроизведение
def play_song(self, song):
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(self.list[0])))
self.player.play()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
У меня не было нужды устанавливать какие-то пак кодеки.
Основываясь на своем предыдущем ответе, я вам предлагаю проверить следующую идею, суть которой заключается в установлении позиции воспроизведения.
Значение позиции я добавил в self.list,
один файл проигрываем с самого начала,
а другой с позиции воспроизведения 20000 milliseconds.
Вставьте для своих сломанных файлов примерное количество milliseconds, которое длится этот электронный звук.
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# self.list = ['1.Papercut.mp3', '13.Numb.mp3']
# self.list = ['bibi.mp3', 'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3']
self.list = {
'bibi.mp3': [1, ], # 1
'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3': [20000, ] # 20000
}
self.song = ''
self.player = QtMultimedia.QMediaPlayer()
self.box = QtWidgets.QGridLayout(self)
for line, song in enumerate(self.list):
play_btn = QtWidgets.QPushButton('Play', clicked=lambda ch, song=song: self.play(song))
pause_btn = QtWidgets.QPushButton('Pause', clicked=self.pause, enabled=False)
label = QtWidgets.QLabel(song)
self.box.addWidget(play_btn, line, 0)
self.box.addWidget(pause_btn, line, 1)
self.box.addWidget(label, line, 2)
self.list[song].append(play_btn)
self.list[song].append(pause_btn)
# Воспроизведение
def play(self, song):
if self.player.isAudioAvailable() == False:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.list[song][2].setEnabled(True) # [2]
self.song = song
self.player.setPosition(self.list[song][0]) # + setPosition
if self.song == song:
pass
else:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.list[self.song][2].setEnabled(False) # [2]
self.list[song][2].setEnabled(True) # [2]
self.song = song
# self.list[song][0] - это текущая позиция воспроизведения,
# выраженная в миллисекундах с начала мультимедиа.
self.player.setPosition(self.list[song][0]) # + setPosition
self.player.play()
# duration - Это свойство содержит продолжительность текущего медиа.
QtCore.QTimer.singleShot(200, lambda: print(f'duration -> {self.player.duration()}')) # +++
# position - Это свойство содержит позицию воспроизведения текущего носителя.
QtCore.QTimer.singleShot(200, lambda: print(f'position -> {self.player.position()}')) # +++
# Пауза
def pause(self):
self.player.pause()
# Повтор
def replay(self):
pass
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())
