首页 > 其他分享 >33. 媒体操作

33. 媒体操作

时间:2025-01-21 19:38:53浏览次数:1  
标签:layout 媒体 33 self QMediaPlayer 操作 播放 button 音频

一、音频播放

  QSoundEffect 可以用来播放无压缩的音频文件(典型的是 .wav 文件),通过它我们不仅能够以低延迟的方式来播放音频,还能够对音频进行更进一步的操作(比如控制音量)。该类非常适合用来播放交互音效,如弹出框的提示音、游戏音效等。

  我们可以在终端中使用 pip 安装 pyside6 模块。

pip install pyside6

  创建 QSoundEffect 类的对象方法如下:

QSoundEffect(parent:QObject=None)
QSoundEffect(audioDevice:QAudioDevice, parent:QObject=None)

  QSoundEffect 类常用方法如下:

# 实例方法
setSource(url:QUrl) -> None                     # 设置音频源
source() -> QUrl                                # 获取音频源
setAudioDevice(device:QAudioDevice) -> None     # 设置音频设备
audioDevice() -> QAudioDevice                   # 获取音频设备
setLoopCount(loopCount:int) -> None             # 设置播放次数
loopCount() -> int                              # 获取播放次数
loopsRemaining() -> int                         # 获取剩余播放次数
setMuted(muted:bool) -> None                    # 设置是否静音
isMuted() -> bool                               # 获取是否静音
setVolume(volume:float) -> None                 # 设置音量
volume() -> float                               # 获取音量
isPlaying() -> bool                             # 获取是否正在播放
isLoaded() -> bool                              # 获取是否已经加载声源
status() -> QSoundEffet.Status                  # 获取播放状态

# 槽函数
play() -> None                                  # 开始播放
stop() -> None                                  # 停止播放

# 静态方法
supportedMimeTypes() -> List[str]               # 获取支持的类型

  用 setSource(url:QUrl) 方法设置音频源,参数 QUrl 可以是指向网络的文件,也可以是本机文件;用 source()方法获取音频源 QUrl。

  用 status() 方法获取当前的播放状态,返回值是枚举类型 QSoundEffect.Status,可取值如下:

QSoundEffect.Status.Null
QSoundEffect.Status.Loading
QSoundEffect.Status.Ready
QSoundEffect.Status.Error

  QSoundEffect 类常用信号如下:

audioDeviceChanged()                # 音频设备发生改变时发射信号
loadedChanged()                     # 加载状态发生改变时发射信号
loopCountChanged()                  # 循环次数发生改变时发射信号
loopsRemainingChanged()             # 剩余循环次数发生改变时发射信号
mutedChanged()                      # 静音状态发生改变时发射信号
playingChanged()                    # 播放状态发生改变时发射信号
sourceChanged()                     # 音频源发生改变时发射信号  
statusChanged()                     # 状态发生改变时发射信号
volumeChanged()                     # 音量发生改变时发射信号
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QLabel, QPushButton, QCheckBox, QSlider
from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QFormLayout
from PySide6.QtWidgets import QFileDialog
from PySide6.QtCore import QUrl, Qt
from PySide6.QtMultimedia import QSoundEffect

class MyWidget(QWidget):
    def __init__(self):
        # 1、调用父类的__init__()方法
        super().__init__()
        self.setup_ui()

    def setup_ui(self):
        # 1、设置窗口对象大小
        self.resize(700, 500)

        # 2、创建音频播放对象
        self.audio = QSoundEffect()

        v_layout = QVBoxLayout(self)
        self.label_open_file = QLabel("未选择文件")
        v_layout.addWidget(self.label_open_file)

        form_layout = QFormLayout()
        v_layout.addLayout(form_layout)
        self.label_volume = QLabel("音量:")
        self.slider_volume = QSlider()
        # 设置滑块的范围
        self.slider_volume.setRange(0, 100)
        # 设置滑块的的当前数据
        self.volume = 80
        self.slider_volume.setValue(self.volume)
        form_layout.addRow(self.label_volume, self.slider_volume)
        self.slider_volume.valueChanged.connect(self.change_volume)

        h_layout = QHBoxLayout()
        v_layout.addLayout(h_layout)

        self.button_open_file = QPushButton("选择音频文件")
        self.button_open_file.clicked.connect(self.open_file)
        h_layout.addWidget(self.button_open_file)

        self.button_action = QPushButton("开始播放")
        h_layout.addWidget(self.button_action)
        self.button_action.clicked.connect(self.action)

        self.checkBox_mute = QCheckBox("是否静音")
        h_layout.addWidget(self.checkBox_mute)
        # 没有不确定状态
        self.checkBox_mute.setTristate(False)
        # 设置复选框状态
        self.checkBox_mute.setCheckState(Qt.CheckState.Unchecked)
        self.checkBox_mute.stateChanged.connect(self.mute)

        # 当播放状态发生改变时发射信号
        self.audio.playingChanged.connect(self.reset_play)

    def open_file(self):
        # 1、创建文件对话框
        fileName, filter = QFileDialog.getOpenFileName(self, caption="选择音频文件", dir="./", filter="音频文件(*.wav)")
        # 2、选择文件后更改标签的文本
        self.label_open_file.setText(f"你选择了【{fileName}】音频文件")
        # 3、设置音频播放对象的声源
        self.audio.setSource(QUrl.fromLocalFile(fileName))
        # 4、设置音频播放对象的播放次数
        self.audio.setLoopCount(1)
        # 5、设置音频播放对象不静音
        self.audio.setMuted(False)
        # 6、设置音量
        self.audio.setVolume(self.volume / 100)
        # 7、重置为开始播放按钮
        self.button_action.setText("开始播放")

    def action(self):
        if self.button_action.text() == "开始播放":
            # 开始播放
            self.audio.play()
            # 重新设置按键文本为停止播放
            self.button_action.setText("停止播放")
        elif self.button_action.text() == "停止播放":
            # 停止播放
            self.audio.stop()
            # 重新设置按键文本为开始播放
            self.button_action.setText("开始播放")

    def mute(self, state):
        if state:
            # 设置音频播放对象静音
            self.audio.setMuted(True)
        else:
            # 设置音频播放对象不静音
            self.audio.setMuted(False)

    def change_volume(self, value):
        # 设置音量
        self.audio.setVolume(value / 100)

    def reset_play(self):
        self.button_action.setText("开始播放")

if __name__ == "__main__":
    # 1、创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2、创建一个窗口
    window = MyWidget()
    # 3、展示窗口
    window.show()
    # 4、进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

二、媒体播放器

  播放器 QMediaPlayer 可以播放音频和视频,它可以直接播放的格式有限。要播放更多格式的音频或视频,例如 mp4 格式的视频文件,需要在本机上安装解码器。

  QMediaPlayer 继承自 QObject,用 QMediaPlayer 定义播放器实例对象的方法如下所示,其中 parent 是继承自 QObject 类的实例对象。

QMediaPlayer(parent:QObject=None)

  QMediaPlayer 类的常用方法:

# 实例方法
sourceDevice() -> QIODevice                                                         # 获取音频或视频源QIODevice

setActiveAudioTrack(index:int) -> None                                              # 设置当前的声道
activeAudioTrack() -> int                                                           # 获取当前的声道
setActiveVideoTrack(index:int) -> None                                              # 设置当前的视频轨道
activeVideoTrack() -> int                                                           # 获取当前的视频轨道
setActiveSubtitleTrack(index:int) -> None                                           # 设置当前的子标题轨道
activeSubtitleTrack() -> int                                                        # 获取当前的子标题轨道

playbackRate() -> float                                                             # 获取播放速率
isSeekable() -> bool                                                                # 获取是否可以定位到某一播放时间
position() -> int                                                                   # 获取当前的播放时间(毫秒)

setAudioOutput(output:QAudioOutput) -> None                                         # 设置播放音频的设备
setVideoOutput(arg__1:QVideoWidget) -> None                                         # 设置显示视频的控件
setVideoOutput(arg__1:QGraphcicVideoItem) -> None                                   # 设置显示视频的图项

setLoops(loops:int) -> None                                                         # 设置循环播放次数
loops() -> int                                                                      # 获取循环播放次数

duration() -> int                                                                   # 获取音频或视频可以播放的总时长(毫秒)

playbackState() -> QMedioPlayer.playbackState                                       # 获取播放状态
mediaStatus() -> mediaStatus                                                        # 获取播放器所处的状态

error() -> QMediaPlayer.Error                                                       # 获取出错原因
errorString() -> str                                                                # 获取出错信息

hasAudio() -> bool                                                                  # 获取多媒体中是否有音频
hasVideo() -> bool                                                                  # 获取多媒体中是否有视频

bufferProgress() -> float                                                           # 获取缓冲百分比,100%时才可以播放

# 槽方法
setSource(source:QUrl, str) -> None                                                 # 设置要播放的音频或视频源
setSourceDevice(device:QIODevice, sourceUrl:QUrl=QUrl()) -> None                    # 设置音频或视频地址QUrl
setPlaybackRate(rate:float) -> None                                                 # 设置播放速率
setPosition(position:int) -> None                                                   # 设置播放时间(毫秒)

play() -> None                                                                      # 播放音频或视频
pause() -> None                                                                     # 暂停播放
stop() -> None                                                                      # 停止播放并将播放位置重置到开头

  要播放音频或视频,首先需要给 QMediaPlayer 设置媒体源。可以用 setSource(source:QUrl) 方法或用 setSourceDevice(device:QIODevice,sourceUrl:QUrl=Default(QUrl)) 方法设置媒体文件,其中 sourceUrl 是可选参数,用于获取额外的信息;用 source()sourceDevice() 分别获取媒体源 QUrl 和 QIODevice。

  要显示视频,需要将 QMediaPlayer 与显示视频的控件关联,可以显示视频的控件有 QVideoWidget、QGraphicsVideoItem,关联方法分别是 setVideoOutput(QVideoWidget)setVideoOutput(QGraphicsVideoItem) 。要播放音频,需要用 setAudioOutput(output:QAudioOutput)方法设置音频输出设备。

  用 setPlaybackRate(rate:float) 方法设置播放速率,参数为 1.0 表示正常播放;参数 rate 可以为负值,表示回放速率。有些多媒体不支持回放。

  用 setLoops(loops:int) 方法设置循环播放次数,参数 loops 可取 QMediaPlayer.Infinite(无限次)、QMediaPlayer.Once(一次)或 其它整数。

  用 state() 方法获取播放状态 QMediaPlayer.State,返回值可能取值如下:

QMediaPlayer.State.StoppedState
QMediaPlayer.State.PlayingState
QMediaPlayer.State.PausedState

  用 playbackState() 方法获取播放器的播放状态 QMediaPlayer.PlaybackState,返回值可能取值如下:

QMediaPlayer.PlaybackState.StoppedState
QMediaPlayer.PlaybackState.PlayingState
QMediaPlayer.PlaybackState.PausedState

  用 mediaStatus() 方法获取播放器所处的状态 QMediaPlayer.MediaStatus,返回值可能取值如下:

QMediaPlayer.MediaStatus.NoMedia
QMediaPlayer.MediaStatus.LoadingMedia
QMediaPlayer.MediaStatus.LoadedMedia
QMediaPlayer.MediaStatus.StalledMedia
QMediaPlayer.MediaStatus.BufferingMedia
QMediaPlayer.MediaStatus.BufferedMedia
QMediaPlayer.MediaStatus.EndOfMedia
QMediaPlayer.MediaStatus.InvalidMedia

  用 error() 方法获取播放器出错信息 QMediaPlayer.Error,返回值可能取值如下:

QMediaPlayer.Error.NoError
QMediaPlayer.Error.ResourceError
QMediaPlayer.Error.FormatError
QMediaPlayer.Error.NetworkError
QMediaPlayer.Error.AccessDeniedError

  QMediaPlayer 类的常用信号:

activeTracksChanged()                                       # 当轨道发生改变时发射信号
audioOutputChanged()                                        # 音频输出设备发生改变时发射信号
bufferProgressChanged(progress:float)                       # 缓冲进度发生改变时发射信号
durationChanged(duration:int)                               # 播放时长发生改变时发射信号
errorChanged()                                              # 出错信息发生改变时发射信号
errorOccurred(error:QMediaPlayer.Error, errorString:str)    # 播放出错时发射信号
hasAudioChanged(available:bool)                             # 可播放音频的状态发生改变时发射信号
hasVideoChanged(videoAvailable:bool)                        # 可播放视频的状态发生改变时发射信号
loopsChanged()                                              # 播放次数发生改变时发射信号
mediaStatusChanged(status:QMediaPlayer.MediaStatus)         # 播放器所在的状态发生改变时发射信号
metaDataChanged()                                           # 播放器元数据发生改变时发射信号
playbackRateChanged(rate:float)                             # 播放速度发生改变时发射信号
playbackStateChanged(newState:QMediaPlayer.PlaybackState)   # 播放状态发生改变时发射信号 
playingChanged(playing:bool)                                # 播放状态发生改变时发射信号
positionChanged(position:int)                               # 播放位置发生改变时发射信号
seekableChanged(seekable:bool)                              # 可定位播放状态发生改变时发射信号
sourceChanged(media:QUrl)                                   # 音频或视频源发生改变时发射信号
tracksChanged()                                             # 轨道发生改变时发射信号
videoOutputChanged()                                        # 关联的视频播放器发生改变时发射信号

  播放器 QMediaPlayer 需要关联音频输出设备和视频输出控件才能播放音频和视频。音频输出需要定义 QAudioOutput 的实例,QAudioOutput 用于连接 QMediaPlayer 与音频输出设备,视频输出需要用到视频控件 QVideoWidget 或视频图项 QGraphicsVideoItem,其中 QGraphicsVideoItem 作为图项应用于场景中。QAudioOutput 继承自 QObject,QVideoWidget 继承自 QWidget,QGraphicsVideoItem 继承自 QGraphicsObject。

  用 QAudioOutput、QVideoWidget 和 QGraphicsVideoItem 创建实例对象的方法如下所示,其中 QAudioDevice 是本机上的音频输入输出设备。

QAudioOutput(parent:QObject=None)
QAudioOutput(device:QAudioDevice, parent:QObject=None)

QVideoWidget(parent:QWidget=None)

QGraphicsVideoItem(parent:QGrapicsItem=None)

  QAudioOutput 类的常用方法如下:

# 实例方法
volume() -> float                               # 获取音量
isMuted() -> bool                               # 获取是否静音
device() -> QAudioDevice                        # 获取音频设备

# 槽方法
setVolume(volume:float) -> None                 # 设置音量,参数取值范围为0~1
setMuted(muted:bool) -> None                    # 设置静音状态
setDevice(device:QAudioDevice) -> None          # 设置音频设备

  QAudioOutput 类的常用信号如下:

deviceChanged()                     # 音频设备发生改变时发射信号
mutedChanged(muted:bool)            # 静音状态发生改变时发送信号
volumeChanged(volume:float)         # 音量发生改变时候发射信号
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QLabel, QPushButton, QCheckBox, QSlider
from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QFormLayout
from PySide6.QtWidgets import QFileDialog
from PySide6.QtCore import QUrl, Qt
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput

class MyWidget(QWidget):
    def __init__(self):
        # 1、调用父类的__init__()方法
        super().__init__()
        self.mediaPlayer = None
        self.setup_ui()

    def setup_ui(self):
        # 1、设置窗口对象大小
        self.resize(700, 500)

        v_layout = QVBoxLayout(self)
        self.label_open_file = QLabel("未选择文件")
        v_layout.addWidget(self.label_open_file)

        form_layout = QFormLayout()
        v_layout.addLayout(form_layout)
        self.label_volume = QLabel("音量:")
        self.slider_volume = QSlider()
        # 设置音量滑块的范围
        self.slider_volume.setRange(0, 100)
        form_layout.addRow(self.label_volume, self.slider_volume)
        self.slider_volume.valueChanged.connect(self.change_volume)

        h_layout = QHBoxLayout()
        v_layout.addLayout(h_layout)

        self.button_open_file = QPushButton("选择音频文件")
        self.button_open_file.clicked.connect(self.open_file)
        h_layout.addWidget(self.button_open_file)

        self.button_action = QPushButton("开始播放")
        h_layout.addWidget(self.button_action)
        self.button_action.clicked.connect(self.action)

        self.button_stop = QPushButton("停止播放")
        h_layout.addWidget(self.button_stop)
        self.button_stop.clicked.connect(self.stop)

        self.checkBox_mute = QCheckBox("是否静音")
        h_layout.addWidget(self.checkBox_mute)
        # 没有不确定状态
        self.checkBox_mute.setTristate(False)
        self.checkBox_mute.toggled.connect(self.mute)

    def open_file(self):
        # 1、创建媒体播放器对象
        self.mediaPlayer = QMediaPlayer()

        # 2、创建音频播放对象
        self.audioOutput = QAudioOutput()
        # 3、设置播放音频的设备
        self.mediaPlayer.setAudioOutput(self.audioOutput)

        # 4、创建文件对话框
        fileName, filter = QFileDialog.getOpenFileName(self, caption="选择音频文件", dir="./", filter="音频文件(*.wav *.flac)")

        # 5、选择文件后更改标签的文本
        self.label_open_file.setText(f"你选择了【{fileName}】音频文件")
        # 6、重置为开始播放按钮
        self.button_action.setText("开始播放")

        # 7、设置媒体播放器对象的声源
        self.mediaPlayer.setSource(QUrl.fromLocalFile(fileName))
        # 8、设置媒体播放器对象的播放次数
        self.mediaPlayer.setLoops(1)

        # 9、设置音频播放对象是否静音
        self.audioOutput.setMuted(False)
        self.checkBox_mute.setCheckState(Qt.CheckState.Unchecked)

        # 10、设置音量
        self.slider_volume.setValue(80)
        self.audioOutput.setVolume(0.8)

        # 11、播放状态发生改变时发射信号
        self.mediaPlayer.playbackStateChanged.connect(self.reset_play)

    def action(self):
        if self.mediaPlayer:
            if self.button_action.text() == "开始播放":
                # 开始播放
                self.mediaPlayer.play()
                # 重新设置按键文本为停止播放
                self.button_action.setText("暂停播放")
            elif self.button_action.text() == "暂停播放":
                # 停止播放
                self.mediaPlayer.pause()
                # 重新设置按键文本为开始播放
                self.button_action.setText("开始播放")

    def stop(self):
        if self.mediaPlayer:
            # 1、媒体播放器停止播放
            self.mediaPlayer.stop()
            # 2、重置为开始播放按钮
            self.button_action.setText("开始播放")

    def mute(self, state):
        if self.mediaPlayer:
            if state:
                # 设置音频播放对象静音
                self.audioOutput.setMuted(True)
            else:
                # 设置音频播放对象不静音
                self.audioOutput.setMuted(False)

    def change_volume(self, value):
        if self.mediaPlayer:
            # 设置音量
            self.audioOutput.setVolume(value / 100)

    def reset_play(self, state):
        if self.mediaPlayer:
            if state == QMediaPlayer.PlaybackState.StoppedState:
                self.button_action.setText("开始播放")

if __name__ == "__main__":
    # 1、创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2、创建一个窗口
    window = MyWidget()
    # 3、展示窗口
    window.show()
    # 4、进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

  QVideoWidget 类的常用方法如下:

# 实例方法
aspectRatioMode() -> Qt.AspectRatioMode                         # 获取长宽比模式

isFullScreen() -> bool                                          # 获取是否全屏显示

# 槽方法
setAspectRatioMode(mode:Qt.AspectRatioMode) -> None             # 设置长宽比模式
setFullScreen(fullScreen:bool) -> None                          # 设置全屏显示

  QVideoWidget 类的常用方法如下:

aspectRatioModeChanged(mode:Qt.AspectRatioMode)         # 长宽比模式发生改变时发射信号
fullScreenChanged(fullScreen:bool)                      # 全屏状态发生改变时发射信号

  QGraphicsVideoItem 类的常用方法如下:

setAspectRatioMode(mode:Qt.AspectRatioMode) -> None     # 设置长宽比模式
aspectRatioMode() -> Qt.AspectRatioMode                 # 获取长宽比模式
setOffset(offset:Union[QSize, QSizeF]) -> None          # 设置偏移量
offset() -> QPointF                                     # 获取偏移量
setSize(size:Union[QSize, QSizeF]) -> None              # 设置尺寸
size() -> QSizeF                                        # 获取尺寸

  QGraphicsVideoItem 类的常用方法如下:

nativeSizeChanged(size:QSizeF)                  # 尺寸发生改变时发射信号

  其中,用 setAspectRatioMode(mode:Qt.AspectRatioMode) 方法设置视频控件所播放视频的长宽比模式,参数 mode 可取值如下:

Qt.AspectRatioMode.IgnoreAspectRatio             # 不保持比例关系
Qt.AspectRatioMode.KeepAspectRatio               # 保持原比例关系
Qt.AspectRatioMode.KeepAspectRatioByExpanding    # 通过扩充保持原比例关系
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QLabel, QPushButton, QCheckBox, QSlider
from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QFormLayout
from PySide6.QtWidgets import QFileDialog
from PySide6.QtCore import QUrl, Qt
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput
from PySide6.QtMultimediaWidgets import QVideoWidget, QGraphicsVideoItem

class MyWidget(QWidget):
    def __init__(self):
        # 1、调用父类的__init__()方法
        super().__init__()
        self.mediaPlayer = None
        self.setup_ui()

    def setup_ui(self):
        # 1、设置窗口对象大小
        self.resize(700, 500)

        v_layout = QVBoxLayout(self)
        self.label_open_file = QLabel("未选择文件")
        v_layout.addWidget(self.label_open_file)

        # 2、创建视频播放对象
        self.videoWidget = QVideoWidget()
        v_layout.addWidget(self.videoWidget)

        form_layout = QFormLayout()
        v_layout.addLayout(form_layout)
        self.label_volume = QLabel("音量:")
        self.slider_volume = QSlider()
        # 设置音量滑块的布局
        self.slider_volume.setOrientation(Qt.Orientation.Horizontal)
        # 设置音量滑块的范围
        self.slider_volume.setRange(0, 100)
        form_layout.addRow(self.label_volume, self.slider_volume)
        self.slider_volume.valueChanged.connect(self.change_volume)

        h_layout = QHBoxLayout()
        v_layout.addLayout(h_layout)

        self.button_open_file = QPushButton("选择视频文件")
        self.button_open_file.clicked.connect(self.open_file)
        h_layout.addWidget(self.button_open_file)

        self.button_action = QPushButton("开始播放")
        h_layout.addWidget(self.button_action)
        self.button_action.clicked.connect(self.action)

        self.button_stop = QPushButton("停止播放")
        h_layout.addWidget(self.button_stop)
        self.button_stop.clicked.connect(self.stop)

        self.checkBox_mute = QCheckBox("是否静音")
        h_layout.addWidget(self.checkBox_mute)
        # 没有不确定状态
        self.checkBox_mute.setTristate(False)
        self.checkBox_mute.stateChanged.connect(self.mute)

    def open_file(self):
        # 1、创建媒体播放器对象对象
        self.mediaPlayer = QMediaPlayer()

        # 2、创建音频播放对象
        self.audioOutput = QAudioOutput()
        # 3、设置播放音频的设备
        self.mediaPlayer.setAudioOutput(self.audioOutput)

        # 4、设置播放视频的设备
        self.mediaPlayer.setVideoOutput(self.videoWidget)

        # 5、创建文件对话框
        fileName, filter = QFileDialog.getOpenFileName(self, caption="选择视频文件", dir="./", filter="音频文件(*.wav *.flac);;视频文件(*.avi)")

        # 6、选择文件后更改标签的文本
        self.label_open_file.setText(f"你选择了【{fileName}】视频文件")
        # 7、重置为开始播放按钮
        self.button_action.setText("开始播放")

        # 8、设置音频播放对象的声源
        self.mediaPlayer.setSource(QUrl.fromLocalFile(fileName))
        # 9、设置音频播放对象的播放次数
        self.mediaPlayer.setLoops(1)

        # 10、设置音频播放对象不静音
        self.checkBox_mute.setCheckState(Qt.CheckState.Unchecked)
        self.audioOutput.setMuted(False)

        # 11、设置音量
        self.slider_volume.setValue(80)
        self.audioOutput.setVolume(0.8)

        # 12、设置视频控件所播放视频的长宽比模式
        self.videoWidget.setAspectRatioMode(Qt.AspectRatioMode.KeepAspectRatioByExpanding)

        # 13、播放状态发生改变时发射信号
        self.mediaPlayer.playbackStateChanged.connect(self.reset_play)

    def action(self):
        if self.mediaPlayer:
            if self.button_action.text() == "开始播放":
                # 开始播放
                self.mediaPlayer.play()
                # 重新设置按键文本为停止播放
                self.button_action.setText("暂停播放")
            elif self.button_action.text() == "暂停播放":
                # 停止播放
                self.mediaPlayer.pause()
                # 重新设置按键文本为开始播放
                self.button_action.setText("开始播放")

    def stop(self):
        if self.mediaPlayer:
            # 1、媒体播放器停止播放
            self.mediaPlayer.stop()
            # 2、重置为开始播放按钮
            self.button_action.setText("开始播放")

    def mute(self, state):
        if self.mediaPlayer:
            if state:
                # 设置音频播放对象静音
                self.audioOutput.setMuted(True)
            else:
                # 设置音频播放对象不静音
                self.audioOutput.setMuted(False)

    def change_volume(self, value):
        if self.mediaPlayer:
            # 设置音量
            self.audioOutput.setVolume(value / 100)

    def reset_play(self, state):
        if self.mediaPlayer:
            if state == QMediaPlayer.PlaybackState.StoppedState:
                self.button_action.setText("开始播放")

if __name__ == "__main__":
    # 1、创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2、创建一个窗口
    window = MyWidget()
    # 3、展示窗口
    window.show()
    # 4、进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

标签:layout,媒体,33,self,QMediaPlayer,操作,播放,button,音频
From: https://www.cnblogs.com/FlurryHeart/p/18684280

相关文章

  • 《操作系统真象还原》第九章 线程(一) 在内核中实现线程
    第九章线程(一)在内核中实现线程本文是对《操作系统真象还原》第九章(一)学习的笔记,欢迎大家一起交流。我们在本节的任务:创建并初始化PCB模拟pthread_create函数创建线程并执行线程函数首先我们要明确内核级线程的优势,内核级线程是cpu的一个调度单位,当一个进程中的线程越多,享......
  • Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )
    一、文件处理1.1、文件操作的重要性和应用场景 1.1.1、重要性 数据持久化:        文件是存储数据的一种非常基本且重要的方式。通过文件,我们可以将程序运行时产生的数据永久保存下来,以便将来使用。跨平台兼容性:        文件是一种通用的数据交换格......
  • 2025年3月全国计算等级考试(报名操作指南)从零基础到精通,收藏这篇就够了!
    2025年3月全国计算等级考试*报名指南新学期·新起点报名时间下次全国计算机等级考试时间:2025年3月22-23日。预计报名时间:2024年12月底至2025年1月上旬,各省具体报名时间可能有所差异,以正式通知为准。报名要求及步骤一般来说,无论你是大学生还是已经工作的职场人士,都是......
  • 30天自制操作系统day1&day2
    day1:  二进制编辑器bz:https://www.vcraft.jp/soft/bz.html  初识机器语言和汇编语言,并分别用其实现了软盘映像文件(完全用作者的复制粘贴)。  二进制编辑器中输入内容如下:  只有图中部分有非0内容,其余部分均为0,最末行首地址是001440。  保存为helloos.img,即为一个......
  • 如何使用 Python 进行文件读写操作?
    大家好,我是V哥。今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴。以下是Python中进行文件读写操作的基本方法:一、文件读取:#打开文件withopen('example.txt','r')asfile:#读取文......
  • idea操作下
    IDEA常用快捷键现在多使用ai进行编程,这些快捷键仅仅需要了解。快捷键作用main、pvsm、sout,...快捷输入相关代码ctrl+D复制当前行数据到下一行ctrl+Y删除所在行,建议使用ctrl+Xctrl+alt+L格式化代码alt+shift+向上/下上下移动当前代码ctrl+/,ctrl+sh......
  • 33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处经......
  • 利用dsp28335的sci模块对esp8266wifi模块进行控制
    利用dsp28335的sci模块对esp8266wifi模块进行控制,将数据发出资源文件列表V1_wifi_send/.ccsproject , 519V1_wifi_send/.cdtbuild , 12372V1_wifi_send/.cdtbuild_initial , 12352V1_wifi_send/.cdtproject , 677V1_wifi_send/.cproject , 21668V1_wifi_send/.la......
  • 【LeetCode 刷题】栈与队列-基础操作
    此博客为《代码随想录》字符串章节的学习笔记,主要内容为栈与队列基础操作相关的题目解析。文章目录232.用栈实现队列225.用队列实现栈232.用栈实现队列题目链接classMyQueue:def__init__(self):self.in_s,self.out_s=[],[]......
  • Linux基本操作
    Linux基本指令一.ls指令语法:ls[选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a列出目录下的所有文件,包括以.开头的隐含文件。-d将目录像文件一样显示,而不是显示其下的文件。如:ls–d指定目......