PyQt5 オーディオの再生

QMediaPlayer を使用して音楽ファイルを再生します。
1. QMediaPlayer クラス関数の概要
QMediaPlayer は、wav、mp3、wma、wmv、avi などの圧縮オーディオまたはビデオ ファイルを再生するプレイリストを再生できます。したがって、QMediaPlayer と QMediaPlaylist を使用すると、独自の音楽プレーヤーやビデオ プレーヤーを簡単にデザインできます。

QMediaPlayer の主なインターフェイス機能を表に示します。

関数プロトタイプ 機能説明
間隔() 現在のファイルの合計再生時間をミリ秒単位で返します。 現在のファイルの合計再生時間をミリ秒単位で返します。
setPosition(位置) 現在のファイルの再生位置をミリ秒単位で設定します。
setMuted(ミュート) ミュートするかどうかを設定します。ミュートはbool型です
isMuted() bool 型の戻り値はミュートするかどうかを示し、True はミュートを意味します
setPlaylist(プレイリスト) プレイリストを設定します。プレイリストのタイプは QMediaPlaylist です。
プレイリスト() 設定されたプレイリストを返します。戻り値のタイプは QMediaPlaylist です。
州() プレーヤーの現在の状態を返します。戻り値は列挙型 QMediaPlayer.State です。
setVolume(ボリューム) 再生音量を設定します。int パラメータの volume の値は 0 ~ 100 です。
setPlaybackRate(レート) 再生速度を設定します。float タイプのパラメータのレートのデフォルトは 1 で、これは通常の速度を意味します。
setMedia(メディア) メディア ファイルを再生するように設定します。パラメータ メディアは QMediaContent タイプです
currentMedia() 現在再生中のメディア ファイルを返します。戻り値の型は QMediaContent です。
遊ぶ() プレイを開始する
一時停止() 再生を一時停止する
停止() プレイを停止する

QMediaPlayer には、再生ステータスやファイル情報を反映するための便利な信号がいくつかあります。
(1) stateChanged(state) シグナルは、play()、pause()、stop() 関数が呼び出されたときに発行され、プレーヤーの現在の状態を反映します。パラメータ state は列挙型 QMediaPlayer.State で、プレーヤーの状態を示す 3 つの値があります:
QMediaPlayer.StoppedState (停止状態)、
QMediaPlayer.PlayingState (再生状態)、
QMediaPlayer.PausedState (一時停止された再生状態)。
(2) durationChanged(duration) シグナルは、ファイルの時間の長さが変更されたとき、通常はファイルが切り替わったときに発行されます。パラメータの期間は int 型で、ファイルの期間をミリ秒単位で示します。
(3) 現在のファイルの再生位置が変更されると、positionChanged(position) 信号が発行され、ファイルの再生の進行状況を反映できます。パラメータの位置は int 型で、単位はミリ秒です。

QMediaPlayer は、setMedia() 関数を通じて単一のファイルを再生したり、setPlaylist() 関数を通じて QMediaPlaylist クラス オブジェクトによって表されるプレイリストを設定したり、リスト ファイルを再生したり、次のファイルを自動的に再生したり、ループで再生したりするように設定することができます。 。QMediaPlayer で再生されるファイルは、ローカル ファイルまたはネットワーク上のファイルです。

QMediaPlaylist は、メディア ファイル情報の記録と再生、ファイルの追加と削除、ループ再生モードの設定、リスト ファイル内のファイルの自動切り替え、および現在再生中のファイルが切り替わったときに currentIndexChanged() シグナルと currentMediaChanged() シグナルを発行できます。

2. ウィンドウ ビジネス ロジック クラスの初期
化例は、QMediaPlayer と QMediaPlaylist で設計された音楽プレーヤーであり、そのランタイム インターフェイスが図に示されています。
ここに画像の説明を挿入
ウィンドウの中央には QListWidget コンポーネントがあります。上の 3 つのボタンはファイル管理、プレイリストのファイルの追加、削除、クリアに使用されます。リストの下には再生コントロール ボタン、音量コントロール、進行状況の表示と制御があります。ウィンドウは QMainWindow に基づいており、MainWindow.ui のインターフェイス視覚化設計結果がサンプル ソース ファイルに示されています。

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)

コンストラクターでは、プレーヤー self.player が作成され、プレイリスト self.playlist が作成され、プレーヤーにプレイリストが設定されます。

QMediaPlaylist クラスの setPlaybackMode(mode) 関数はプレイリストのループ モードを設定でき、パラメータ モードは列挙型です。QMediaPlaylist.PlaybackMode には次の値があります: QMediaPlaylist.CurrentItemOnce (現在のトラックは 1 回だけ再生されます
)
;
QMediaPlaylist .CurrentItemInLoop (現在のトラックのループ再生)、
QMediaPlaylist.Sequential (現在のトラックからリストの最後まで順次再生し、その後再生を終了)、
QMediaPlaylist.Loop (リストのループ再生)、
QMediaPlaylist.Random (ランダム再生)。

2 つのプライベート変数 self.__duration と self.__curPos もコンストラクターで作成されます。これらはそれぞれファイルの合計時間長と現在の再生位置を表し、ファイルが切り替わり、再生の進行状況が変化したときに進行状況情報を表示するために使用されます。 。

プログラムは、プレーヤーの 3 つの信号に関連するスロット機能を設定します。これらの 3 つの信号の意味は上で説明しました。QMediaPlaylist の currentIndexChanged(position) 信号は、プレイリストの現在のトラックが変更されるときに発行され、関連するスロット関数もこの信号に設定されます。これら 4 つのカスタム スロット関数のコードは次のとおりです。

##  =============自定义槽函数===============================        
   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. プレイリスト コントロール
ウィンドウの中央にある QListWidget コンポーネントは、再生されるファイルのリストを表示します。インターフェイスに表示されるファイルのリストは、self.playlist に保存されているファイルのリストと同期されます。

ウィンドウ上部にはプレイリスト管理用の「追加」「削除」「クリア」の3つのボタンがあり、その下の「前トラック」「次トラック」ボタンはトラックの移動に使用します。フォームの中央にあるコンポーネント アイテムはトラックを再生できます。これらのボタンとコンポーネントに関連するスロットのコードは次のとおりです。

##  ==========由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)

ここでは主に QMediaPlaylist クラスの以下の関数を使用します。
(1) addMedia(content) 関数: 再生メディア コンテンツを追加するために使用されます。
パラメーターの内容は、メディア リソースを表すために使用されるクラスである QMediaContent 型です。メディア リソースは、ローカルのオーディオ ファイルまたはビデオ ファイル、またはネットワーク上のリソースです。再生メディアを作成してプレイリストに追加するプログラム内のステートメントは次のとおりです。

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

(2) QUrl.fromLocalFile(filename) の機能は、QUrl のクラス関数 fromLocalFile() を使用して、ファイル名 filename に従ってこのファイルを指す QUrl オブジェクトを作成することです。この QUrl オブジェクトは、再生メディア ソングを作成するために QMediaContent のコンストラクターに渡されます。したがって、曲はローカル ファイルを指す QMediaContent オブジェクトであり、QMediaPlaylist.addMedia() 関数を通じてプレイリストに追加されます。
(3)removeMedia(pos)関数:シリアル番号がposであるアイテムをプレイリストから削除する。
(4) プレイリストをクリアするには、clear() 関数を使用します。
(5) setCurrentIndex(pos) 関数: シリアル番号 pos のアイテムを現在再生中のメディアとして設定します。
(6)previous() 関数と next() 関数: プレイリスト内を前後に移動します。移動すると、プレイリストは信号 currentIndexChanged() を発行し、それによってインターフェイス コンポーネント listWidget 内の現在の項目を自動的に更新します。
4. 再生コントロール
プレーヤーを再生、一時停止、または停止するには、QMediaPlayer の対応する関数を呼び出すだけですインターフェイス上の 3 つのボタンのスロット関数コード: プレーヤーの再生状態が変化すると、stateChanged() 信号
がスロット関数 do_stateChanged() を定義して、3 つのボタンの有効ステータスを更新します。
音量調節は「ミュート」ボタンと音量スライダーで行います。
ファイル再生の進行状況バーは、2 つのカスタム スロット関数 do_durationChanged() および do_positionChanged() で更新され、現在のファイル再生の進行状況が表示されます。スライダーのスライダーをドラッグしてファイルの再生位置を設定します。
プログラムがテストを実行すると、音楽の再生中にプログラムを終了しても、再生は自動的に停止しないことがわかります (Qt C++ で書かれた同じプログラムは自動的に停止します)。そのため、ウィンドウの closeEvent() のコードを記入します。音楽の再生を停止するイベント関数。

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

おすすめ

転載: blog.csdn.net/qq_35412059/article/details/128386270