#python #pyqt5
#python #pyqt5
Вопрос:
from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia
from PyQt5.QtCore import QByteArray
from PyQt5.QtMultimedia import QAudioDecoder
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(246, 134)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.start_mp3(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
def start_mp3(self,MainWindow):
self.output_devices_qt = QtMultimedia.QAudioDeviceInfo.availableDevices(QtMultimedia.QAudio.AudioOutput)
file_path = r"C:UsersΧρήστοςDesktopPapinhio playerprojectdisket boxmp3 filesΑΓΙΑ ΚΥΡΙΑΚΗ.mp3"
self.decode_test_sound(file_path,MainWindow)
def decode_test_sound(self,file_path,MainWindow):
self.desiredFormat = QtMultimedia.QAudioFormat()
self.desiredFormat.setCodec("audio/pcm")
self.desiredFormat.setSampleRate(44100)
self.desiredFormat.setChannelCount(1)
self.desiredFormat.setSampleSize(16)
self.desiredFormat.setByteOrder(QtMultimedia.QAudioFormat.LittleEndian)
self.desiredFormat.setSampleType(QtMultimedia.QAudioFormat.SignedInt)
self.m_buffer = QByteArray()
self.m_buffer_copy = QByteArray()
self.decoder = QAudioDecoder()
self.decoder.bufferReady.connect(lambda:self.readBuffer(MainWindow))
self.decoder.setAudioFormat(self.desiredFormat)
self.decoder.setSourceFilename(file_path)
self.decoder.start()
self.play_status = 0
def readBuffer(self,MainWindow):
buffer = self.decoder.read()
count = buffer.byteCount()
if(count>0):
buffer_data = buffer.constData().asstring(count)
self.m_buffer.append(buffer_data)
if(self.play_status!=1):
self.start_player(MainWindow)
self.play_status = 1
else:
return 1
def timeToSize_1(self):
return ((self.desiredFormat.channelCount() * (self.desiredFormat.sampleSize() / 8) * self.desiredFormat.sampleRate()) * self.m_time_to_buffer / 1000)
def timeToSize_2(self):
return ((self.desiredFormat.channelCount() * (self.desiredFormat.sampleSize() / 8) * self.desiredFormat.sampleRate()) * self.MAX_BUFFERED_TIME / 1000)
def preplay(self,MainWindow):
if(self.play_status!=0):
if(self.m_play_called==False):
self.m_play_called = True
self.timer = QtCore.QTimer(MainWindow)
self.timer.setSingleShot(True)
self.timer.singleShot(0,lambda:self.sound_mp3(MainWindow))
def sound_mp3(self,MainWindow):
if(self.play_status!=0):
self.m_play_called = False
if self.m_buffer.isEmpty():
self.stop_player(MainWindow)
self.m_buffer_requested = True
return
elif self.m_buffer.size() < self.m_size_to_buffer:
if self.m_buffer_requested:
return
else:
self.m_buffer_requested = False
readlen = int(self.m_audio_output.periodSize())
chunks = int(self.m_audio_output.bytesFree() / readlen)
while (chunks>0):
samples = self.m_buffer.mid(0, readlen)
len = samples.size()
self.m_buffer.remove(0, len)
if (len>0):
if(self.m_audio_output.state()!=2):
self.m_output_device.write(samples)
else:
return 1
if (len != readlen):
break
chunks = chunks - 1
def start_player(self,MainWindow):
self.m_play_called = False
self.m_buffer_requested = True
self.m_time_to_buffer = 50
self.MAX_BUFFERED_TIME = 100
if (self.desiredFormat.sampleRate() >= 44100):
self.internal_buffer_size = (1024 * 10) * self.desiredFormat.channelCount()
elif (self.desiredFormat.sampleRate() >= 24000):
self.internal_buffer_size = (1024 * 6) * self.desiredFormat.channelCount()
else:
self.internal_buffer_size = (1024 * 4) * self.desiredFormat.channelCount()
#self.m_audio_output = QtMultimedia.QAudioOutput(self.output_devices_qt[self.output_device_index], self.desiredFormat)
self.m_audio_output = QtMultimedia.QAudioOutput(self.output_devices_qt[0], self.desiredFormat)
self.m_audio_output.setBufferSize(self.internal_buffer_size)
self.m_size_to_buffer = int(self.timeToSize_1())
self.m_max_size_to_buffer = self.m_size_to_buffer int(self.timeToSize_2())
self.m_output_device = self.m_audio_output.start()
self.timer_play = QtCore.QTimer(MainWindow)
self.timer_play.setTimerType(QtCore.Qt.PreciseTimer)
self.timer_play.timeout.connect(lambda:self.preplay(MainWindow))
self.timer_play.start(10)
def stop_player(self,MainWindow):
self.play_status = 0
self.m_audio_output.stop()
self.timer_play.stop()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.addLibraryPath(r"C:/Users/Χρήστος/AppData/Local/Programs/Python/Python38/Lib/site-packages/pyqt5_tools/Qt/plugins")
app.addLibraryPath(r"C:/Users/Χρήστος/AppData/Local/Programs/Python/Python38/lib/site-packages/PyQt5/Qt/plugins")
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Приведенный выше код работает хорошо.
Для запуска кода необходимо изменить 3 строки: 24,143 и 144.
Я хочу:
- Установить скорость воспроизведения я ищу что-то похожее на
QtMultimedia.QMediaPlayer().setPlaybackRate(QReal)
- функция уведомления i для изменения QSlider (таймер)
Как я могу сделать 1 и 2?
Я пытаюсь воспроизвести mp3-файлы на устройстве вывода по моему выбору. Затем я хочу иметь возможность управлять громкостью звука, скоростью звука и положением звука (в режиме реального времени). Наконец, я хочу микшировать некоторые mp3 QByteArray для потокового радио
Я думаю, что приведенный выше подход верен, потому что я хочу микшировать некоторые mp3-файлы для потокового радио.
Комментарии:
1. Извините, но, прочитав ваш пост, я не совсем понял, о чем был вопрос.
2. @ewong я просто спрашиваю, как я могу это сделать? (Я имею в виду 1 и 2)
3. 1. Не задавайте два вопроса в одном (хотя они могут показаться вам взаимосвязанными, это не так) 2. Скорость воспроизведения QMediaPlayer управляется внутренней серверной частью медиаплеера, но в вашем случае вы воспроизводите необработанный звук ; единственный способ добиться желаемого — это декодировать звук и выполнять чередование значений сэмплов (что и делает серверная часть при изменении скорости воспроизведения). Это означает, что вам нужно декодировать аудио из исходных байтов, обработать его, а затем перекодировать его снова, чтобы правильно передать аудиовыход.
4. К сожалению, ваш пример слишком сложный (и, если позволите, вся структура слишком запутанна: например, непрерывный вызов функций с
ui, MainWindow
аргументами совершенно не нужен и делает ваш код еще более сложным для чтения, чем он есть; просто создайте их атрибуты экземпляра и используйте эти атрибуты из каждого метода), поэтому яне могу дать вам ответ, так как это займет много времени. Я предлагаю вам поискать ресурсы для декодирования необработанного звука с помощью NumPy и начать с этого.5. @musicamante спасибо за ответ. Я только что обновил код. Я думаю, что это немного легче читать.