Reproducción de audio PyQt5

Utilice QMediaPlayer para reproducir archivos de música
1. Descripción general de las funciones de la clase QMediaPlayer
QMediaPlayer puede reproducir archivos de audio o vídeo comprimidos, como wav, mp3, wma, wmv, avi, etc. Lista de reproducción para reproducir. Entonces, usando QMediaPlayer y QMediaPlaylist puedes diseñar fácilmente tu propio reproductor de música o video.

Las principales funciones de la interfaz de QMediaPlayer se muestran en la tabla:

prototipo de función Descripcion funcional
duración() Devuelve el tiempo total de reproducción del archivo actual, en ms. Devuelve el tiempo total de reproducción del archivo actual, en ms.
establecerPosición(posición) Establece la posición de reproducción del archivo actual, en ms
setMuted(silenciado) Establezca si silenciar, silenciado es de tipo bool
está silenciado() El valor de retorno de tipo bool indica si se debe silenciar, True significa silenciar
establecer lista de reproducción (lista de reproducción) Configure la lista de reproducción, la lista de reproducción es del tipo QMediaPlaylist
lista de reproducción() Devuelve la lista de reproducción establecida, el valor de retorno es del tipo QMediaPlaylist
estado() Devuelve el estado actual del reproductor, el valor de retorno es el tipo de enumeración QMediaPlayer.State
establecerVolumen(volumen) Configure el volumen de reproducción, el valor del volumen del parámetro int está entre 0 y 100
setPlaybackRate(tasa) Establezca la velocidad de reproducción, la velocidad del parámetro de tipo flotante está predeterminada en 1, lo que significa velocidad normal
setMedia(medios) Configurado para reproducir archivos multimedia, el parámetro multimedia es del tipo QMediaContent
medios actuales() Devuelve el archivo multimedia que se está reproduciendo actualmente y el valor de retorno es de tipo QMediaContent
jugar() empezar a jugar
pausa() Pausar la reproducción
detener() detener el juego

QMediaPlayer tiene varias señales útiles para reflejar el estado de reproducción o la información del archivo.
(1) La señal stateChanged (estado) se emite cuando se llaman las funciones play (), pausa (), stop (), lo que refleja el estado actual del reproductor. El estado del parámetro es el tipo de enumeración QMediaPlayer.State, que tiene 3 valores, que indican el estado del reproductor:
QMediaPlayer.StoppedState (estado detenido);
QMediaPlayer.PlayingState (estado de reproducción);
QMediaPlayer.PausedState (estado de reproducción en pausa).
(2) La señal de duraciónChanged(duración) se emite cuando cambia la duración del archivo, generalmente cuando se cambia el archivo. La duración del parámetro es de tipo int, que indica la duración del archivo, en ms.
(3) La señal positionChanged (posición) se emite cuando cambia la posición de reproducción del archivo actual, lo que puede reflejar el progreso de la reproducción del archivo. La posición del parámetro es de tipo int y la unidad es ms.

QMediaPlayer puede reproducir un solo archivo a través de la función setMedia(), o configurar una lista de reproducción representada por un objeto de clase QMediaPlaylist a través de la función setPlaylist(), reproducir el archivo de la lista y configurarlo para reproducir automáticamente el siguiente archivo o reproducirlo en un bucle, etc. . Los archivos reproducidos por QMediaPlayer pueden ser archivos locales o archivos en la red.

QMediaPlaylist registra y reproduce información de archivos multimedia, puede agregar y eliminar archivos, puede configurar el modo de reproducción en bucle, cambiar automáticamente los archivos en el archivo de lista y emitir la señal currentIndexChanged() y currentMediaChanged() cuando se cambia el archivo de reproducción actual.

2. El
ejemplo de inicialización de la clase de lógica empresarial de ventana es un reproductor de música diseñado con QMediaPlayer y QMediaPlaylist, y su interfaz de ejecución se muestra en la figura.
inserte la descripción de la imagen aquí
En el medio de la ventana hay un componente QListWidget. Los tres botones de arriba se utilizan para administrar archivos, agregar, eliminar y borrar archivos de la lista de reproducción. Debajo de la lista están los botones de control de reproducción, control de volumen, visualización de progreso y control. La ventana se basa en QMainWindow y los resultados del diseño de visualización de la interfaz de MainWindow.ui se muestran en el archivo fuente de muestra.

import sys

from PyQt5.QtWidgets import  QApplication, QMainWindow,QFileDialog,QListWidgetItem

from PyQt5.QtCore import  pyqtSlot,QUrl,QModelIndex,QDir,QFileInfo

from PyQt5.QtGui import QIcon

from PyQt5.QtMultimedia import QMediaPlayer, QMediaPlaylist,QMediaContent


from ui_MainWindow import Ui_MainWindow

class QmyMainWindow(QMainWindow): 
   def __init__(self, parent=None):
      super().__init__(parent)   #调用父类构造函数,创建窗体
      self.ui=Ui_MainWindow()    #创建UI对象
      self.ui.setupUi(self)      #构造UI界面

##      self.setWindowTitle("Demo10_1,音乐播放器")
      self.player = QMediaPlayer(self)
      self.playlist = QMediaPlaylist(self)
      self.player.setPlaylist(self.playlist)
      self.playlist.setPlaybackMode(QMediaPlaylist.Loop)    #循环模式

      self.__duration=""      #文件总时间长度
      self.__curPos=""        #当前播放到位置

	  self.player.stateChanged.connect(self.do_stateChanged)
      
      self.player.positionChanged.connect(self.do_positionChanged)
      
      self.player.durationChanged.connect(self.do_durationChanged)
      
      self.playlist.currentIndexChanged.connect(self.do_currentChanged)

En el constructor, se crea el reproductor self.player, se crea la lista de reproducción self.playlist y se configura la lista de reproducción para el reproductor.

La función setPlaybackMode (modo) de la clase QMediaPlaylist puede establecer el modo de bucle de la lista de reproducción, y el modo de parámetro es un tipo de enumeración.
QMediaPlaylist.PlaybackMode tiene los siguientes valores:
QMediaPlaylist.CurrentItemOnce (la pista actual solo se reproduce una vez);
QMediaPlaylist .CurrentItemInLoop (reproducción en bucle de la pista actual);
QMediaPlaylist.Sequential (reproducción secuencial desde la pista actual hasta el final de la lista, y luego finaliza la reproducción);
QMediaPlaylist.Loop (reproducción en bucle de la lista);
QMediaPlaylist.Random (reproducción aleatoria).

También se crean dos variables privadas self.__duration y self.__curPos en el constructor, que representan respectivamente la duración total del archivo y la posición de reproducción actual, y se utilizan para mostrar información de progreso cuando se cambia el archivo y el progreso de la reproducción. .

El programa establece funciones de tragamonedas asociadas para las tres señales del jugador, y los significados de estas tres señales se han explicado anteriormente. La señal currentIndexChanged(position) de QMediaPlaylist se emite cuando cambia la pista actual de la lista de reproducción, y la función de ranura asociada también se configura para esta señal. El código de estas 4 funciones de ranura personalizadas:

##  =============自定义槽函数===============================        
   def do_stateChanged(self,state):    ##播放器状态变化
      self.ui.btnPlay.setEnabled(state!=QMediaPlayer.PlayingState)
      self.ui.btnPause.setEnabled(state==QMediaPlayer.PlayingState)
      self.ui.btnStop.setEnabled(state==QMediaPlayer.PlayingState)

   def do_positionChanged(self,position): ##当前文件播放位置变化,更新进度显示
      if (self.ui.sliderPosition.isSliderDown()): #在拖动滑块调整进度
         return
      self.ui.sliderPosition.setSliderPosition(position)
      secs=position/1000   #秒
      mins=secs/60         #分钟
      secs=secs % 60       #余数秒
      self.__curPos="%d:%d"%(mins,secs)
      self.ui.LabRatio.setText(self.__curPos+"/"+self.__duration)

   def do_durationChanged(self,duration):    ##文件时长变化
      self.ui.sliderPosition.setMaximum(duration)

      secs=duration/1000   #秒
      mins=secs/60         #分钟
      secs=secs % 60       #余数秒
      self.__duration="%d:%d"%(mins,secs)
      self.ui.LabRatio.setText(self.__curPos+"/"+self.__duration)

   def do_currentChanged(self,position):  ##playlist当前曲目变化
      self.ui.listWidget.setCurrentRow(position)
      item=self.ui.listWidget.currentItem()  #QListWidgetItem
      if (item != None):
         self.ui.LabCurMedia.setText(item.text())

3. Control de lista de reproducción
En el medio de la ventana, un componente QListWidget muestra la lista de archivos que se reproducirán y la lista de archivos que se muestran en la interfaz se mantiene sincronizada con la lista de archivos almacenados en self.playlist.

Hay tres botones "Agregar", "Eliminar" y "Borrar" en la parte superior de la ventana para administrar la lista de reproducción, y los botones "Pista anterior" y "Pista siguiente" a continuación se utilizan para el movimiento de pistas. Haga doble clic en QListWidget. componente en el medio del formulario Un elemento puede reproducir la pista. El código para las ranuras relevantes para estos botones y componentes:

##  ==========由connectSlotsByName() 自动连接的槽函数==================        
#  播放列表管理
   @pyqtSlot()    ##添加文件
   def on_btnAdd_clicked(self):  
   ##      curPath=os.getcwd()     #获取系统当前目录
   ##      curPath=QDir.homePath()
      curPath=QDir.currentPath()
      dlgTitle="选择音频文件" 
      filt="音频文件(*.mp3 *.wav *.wma);;所有文件(*.*)" 
      fileList,flt=QFileDialog.getOpenFileNames(self,dlgTitle,curPath,filt)
      count=len(fileList)
      if count<1:
         return

      filename=fileList[0]
      fileInfo=QFileInfo(filename)  #文件信息
      QDir.setCurrent(fileInfo.absolutePath())  #重设当前路径

      for i in range(count):
         filename=fileList[i] 
         fileInfo.setFile(filename)
         song=QMediaContent(QUrl.fromLocalFile(filename))
         self.playlist.addMedia(song)  #添加播放媒体
   ##         basename=os.path.basename(filename)    #文件名和后缀
         basename=fileInfo.baseName()
         self.ui.listWidget.addItem(basename)    #添加到界面文件列表

      if (self.player.state()!=QMediaPlayer.PlayingState):
         self.playlist.setCurrentIndex(0)
         self.player.play()
      
   @pyqtSlot()    ##移除一个文件
   def on_btnRemove_clicked(self): 
      pos=self.ui.listWidget.currentRow()
      item=self.ui.listWidget.takeItem(pos)     #python会自动删除

      if (self.playlist.currentIndex()==pos):   #是当前播放的曲目
         nextPos=0
         if pos>=1:
            nextPos=pos-1

         self.playlist.removeMedia(pos)   #从播放列表里移除
         if self.ui.listWidget.count()>0: #剩余个数
            self.playlist.setCurrentIndex(nextPos)
            self.do_currentChanged(nextPos)  #当前曲目变化
         else:
            self.player.stop()
            self.ui.LabCurMedia.setText("无曲目")
      else:
         self.playlist.removeMedia(pos)
      

   @pyqtSlot()    ##清空播放列表
   def on_btnClear_clicked(self):  
      self.playlist.clear()   #清空播放列表
      self.ui.listWidget.clear()  
      self.player.stop()      #停止播放
      
   ##   @pyqtSlot()    ##双击时切换播放文件
   def on_listWidget_doubleClicked(self,index):  
      rowNo=index.row()  #行号
      self.playlist.setCurrentIndex(rowNo)
      self.player.play()

#  播放控制
   @pyqtSlot()    ##播放
   def on_btnPlay_clicked(self):  
      if (self.playlist.currentIndex()<0):
         self.playlist.setCurrentIndex(0)
      self.player.play()

   @pyqtSlot()    ##暂停
   def on_btnPause_clicked(self):  
      self.player.pause()

   @pyqtSlot()    ##停止
   def on_btnStop_clicked(self):  
      self.player.stop()

   @pyqtSlot()    ##上一曲目
   def on_btnPrevious_clicked(self):  
      self.playlist.previous()

   @pyqtSlot()    ##下一曲目
   def on_btnNext_clicked(self):  
      self.playlist.next()

   @pyqtSlot()    ##静音控制
   def on_btnSound_clicked(self):  
      mute=self.player.isMuted()
      self.player.setMuted(not mute)
      if mute:
         self.ui.btnSound.setIcon(QIcon(":/icons/images/volumn.bmp"))
      else:
         self.ui.btnSound.setIcon(QIcon(":/icons/images/mute.bmp"))
      
   @pyqtSlot(int)    ##调节音量
   def on_sliderVolumn_valueChanged(self,value):  
      self.player.setVolume(value)

   @pyqtSlot(int)    ##文件进度调控
   def on_sliderPosition_valueChanged(self,value):  
      self.player.setPosition(value)

Aquí se utilizan principalmente las siguientes funciones de la clase QMediaPlaylist.
(1) Función addMedia (contenido): se utiliza para agregar un contenido multimedia de reproducción.
El contenido del parámetro es de tipo QMediaContent, que es una clase utilizada para representar recursos multimedia. Un recurso multimedia puede ser un archivo de audio o vídeo local, o un recurso en la red. La declaración en el programa para crear medios de reproducción y agregarlos a la lista de reproducción es:

		 song=QMediaContent(QUrl.fromLocalFile(filename))
         self.playlist.addMedia(song)  #添加播放媒体

(2) La función de QUrl.fromLocalFile (nombre de archivo) es utilizar la función de clase fromLocalFile () de QUrl para crear un objeto QUrl que apunte a este archivo de acuerdo con el nombre del archivo. Este objeto QUrl se pasa al constructor de QMediaContent para crear una canción multimedia en reproducción. Entonces, la canción es un objeto QMediaContent que apunta al archivo local y luego se agrega a la lista de reproducción a través de la función QMediaPlaylist.addMedia().
(3) Función removeMedia(pos): elimina un elemento cuyo número de serie es pos de la lista de reproducción.
(4) La función clear() se utiliza para borrar la lista de reproducción.
(5) Función setCurrentIndex(pos): configura el elemento con el número de serie pos como el medio que se está reproduciendo actualmente.
(6) Función anterior () y función siguiente (): avanzar y retroceder en la lista de reproducción. Al moverse, la lista de reproducción emitirá la señal currentIndexChanged (), actualizando así automáticamente el elemento actual en el componente de la interfaz listWidget.
4. Control de reproducción
Para reproducir, pausar o detener el reproductor, solo necesita llamar a la función correspondiente de QMediaPlayer. El código de función de ranura de los tres botones en la interfaz:
cuando el estado de reproducción del reproductor cambia, la señal stateChanged() será emitido y el self asociado Defina la función de ranura do_stateChanged() para actualizar el estado de habilitación de los 3 botones.
El control de volumen se controla mediante un botón de "silencio" y un control deslizante de volumen.
La barra de progreso de reproducción del archivo se actualizará en las dos funciones de ranura personalizadas do_durationChanged() y do_positionChanged() para mostrar el progreso de reproducción del archivo actual. Arrastre el control deslizante del control deslizante para establecer la posición de reproducción del archivo.
Cuando el programa ejecuta la prueba, se descubre que si sale del programa mientras reproduce música, no dejará de reproducirse automáticamente (el mismo programa escrito en Qt C++ se detendrá automáticamente), así que complete el código para closeEvent() de la ventana Función de evento para detener la reproducción de música.

##  ===============event 处理函数==========
   def closeEvent(self,event):  ##窗体关闭时
##  窗口关闭时不能自动停止播放,需手动停止
      if (self.player.state()==QMediaPlayer.PlayingState):
         self.player.stop()

Supongo que te gusta

Origin blog.csdn.net/qq_35412059/article/details/128386270
Recomendado
Clasificación