Qt 之 MediaPlayer 音视频播放

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    文章目录

    1、QMediaPlayer简介

    QMediaPlayer是Qt提供的一个跨平台媒体播放器类。它没有自带解码库而是对平台相关的播放器框架做了封装提供了平台无关的API。

    在Windows下时底层基于微软的DirectShow框架实现需要提前安装解码库。可以下载K-Lite_Codec_Pack或者LAVFilters解码库安装。LAVFilters下载地址https://github.com/Nevcairiel/LAVFilters/releases

    在Linux下时底层基于GStreamer框架实现。

    2、相关类介绍

    2.1 QMediaPlayer

    2.1.1 简单用法

    播放音频

      player = new QMediaPlayer;
      connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
      player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
      player->setVolume(50);
      player->play();
    

    播放视频
    QVideoWidget可与QMediaPlayer一起用于视频渲染与QMediaPlaylist一起用于访问播放列表功能。

      playlist = new QMediaPlaylist;
      playlist->addMedia(QUrl("http://example.com/movie1.mp4"));
      playlist->addMedia(QUrl("http://example.com/movie2.mp4"));
      playlist->addMedia(QUrl("http://example.com/movie3.mp4"));
      playlist->setCurrentIndex(1);
    
      player = new QMediaPlayer;
      player->setPlaylist(playlist);
    
      videoWidget = new QVideoWidget;
      player->setVideoOutput(videoWidget);
      videoWidget->show();
      player->play();
    

    2.1.2 关键枚举类

    这些关键的枚举类是实现好用的播放器的关键。需要重点关注哦。
    播放器状态 QMediaPlayer::State
    播放器有暂停、正在播放和停止三种状态每种状态由下面 QMediaPlayer::MediaStatus来最终表现

    状态枚举名称枚举值说明
    StoppedState0播放停止状态
    PlayingState1播放状态
    PausedState2播放暂停状态

    媒体状态 QMediaPlayer::MediaStatus

    状态枚举名称枚举值说明
    UnknownMediaStatus0未知状态
    Nomedia1无媒体文件player处于StoppedState
    LoadingMedia2媒体文件加载中player可以处于任何状态
    LoadedMedia3媒体文件已加载player处于StoppedState
    StalledMedia4媒体处于延迟或者暂时的中断状态player处于PlayingState或者PauseState
    BufferingMedia5媒体正在缓冲数据player处于PlayingState或者PausedState
    BufferedMedia6媒体缓冲数据完成player处于PlayingState或者PausedState
    EndOfMedia7媒体结束player处于StoppedState
    InvalidMedia8非法的媒体文件player处于StoppedState

    播放标志位Flags

    状态枚举名称枚举值说明
    LowLatency1播放未压缩的音频数据播放表现为低延时需要播放beepsringtones等
    StreamPlayback2播放基于QIODevic构建的媒体文件QMediaPlayer或自动选择支持的流行播放
    VideoSurface4渲染视频到QAbstractVideoSurface otput

    QMediaPlayer::Error 错误标志位

    状态枚举名称枚举值说明
    NoError0无错误
    ResourceError1媒体源错误
    FormatError2格式错误播放可能会丢失音频或视频
    NetworkError3

    网络错误

    AccessDeniedError4访问权限错误
    ServiceMissingError5服务丢失错误

    2.1.3 QMediaPlayer 常用属性

    属性名称取值类型说明访问函数
    audioAvailableconst bool音频是否可用audioAvailableChanged信号函数用于监控其状态bool isAudioAvailable()
    muted bool是否静音 void mutedChanged(bool muted) 信号函数用于监控其状态bool isMuted()
    audioRoleQAudio::Role音频流播放role

    QAudio::Role audioRole() const

    void setAudioRole(QAudio::Role audioRoe)

    bufferStatusconst int缓冲数据的百分比在开始播放或者回复播放之前

    int bufferStatus() const

    void bufferStatusChanged(int percentFilled)

    currentMediaconst qMediaContent当前激活的媒体在使用Playlist时可能与media属性不同

    QMediaContent currentMedia() const

    void currentMediaChanged(const QMediaContent &media)

    durationconst qint64currentMedia的播放时长单位ms

    qint64 duration() const

    void durationChanged(qint64 duration)

    mediaQmediaContent激活并被使用的媒体源

    QMediaContent media() const,

    void setMedia(const QMediaContent &media, QIODevice *stream=nullptr),

    void mediaChanged(const QMediaContent &media)

    playbackRateqreal当前媒体的播放速度默认为1.0

    qreal playbackRate() const

    void setPlaybackRate(qreal rate)

    void playbackRateChanged(qreal rate)

    playlistQMediaPlaylist *播放列表

    QMediaPlaylist *playlist() const

    void setPlaylist(QMediaPlaylist *playlist)

    volumeint音量取值范围0-100

    int volume() const, void setVolume(int volume)

    void volumeChanged(int volume)

    2.2 QVideoWidget

    QvideoWidget是一个用来展示视频的类需要先定义一个QMediaPlayer对象然后将QMediaPlayer的VideoOutput设置为QVideoWidget对象

    常用属性

    名称类型说明
    aspectRatioModeQt::AspectRatioMode屏幕亮度比
    brightnessint亮度
    contrastint对比度
    fullScreenbool是否全屏
    hueint色调
    mediaObjectQMediaObject *const视频媒体对象
    saturationint饱和度

    方法

    返回值类型函数名称描述说明
    Qt::AspectRatioModeaspectRatioMode() const获取视频画面宽高比
    intsaturation() const获取饱和度
    intbrightnees() const获取亮度
    intcontrast() const获取对比度
    inthue() const获取色调
    boolisFullScreen() const获取全屏状态

    槽函数

    返回值类型函数名称描述说明
    voidsetAspectRatioMode(Qt::AspectRatioMode mode)设置宽高比
    voidsetBrightness(int brightness)设置亮度
    void

    setContrast(int contrast)

    设置对比度
    voidsetFullScreen(bool fullScreen)设置全屏状态
    voidsetHue(int hue)设置色调
    voidsetSaturation(int saturation)设置饱和度

    2.3 QMediaPlaylist

    QMediaPlaylist类可以为QMediaPlayer提供一个播放列表它其实是QMediaContent对象的列表QMediaPlayer通过函数setPlaylist来设置一个播放列表。QMediaPlaylist通过函数addMedia向播放列表添加一个媒体文件。

    播放模式PlaybackMode

    状态枚举名称枚举值说明
    CurrentItemOnce0当前选中的媒体文件仅播放一次
    CurrentItemInLoop1当前选中的媒体文件循环播放
    Sequential2从当前选中的媒体文件开始列表中的文件顺序播放一次直到最后一个文件
    Loop3列表中的文件顺序循环播放
    Random4列表中的文件随机播放

    属性

    名称类型说明
    currentIndexint当前播放的媒体文件在列表中的索引
    currentMediaconst QMediaContent当前选中的媒体文件
    playbackModeQMediaPlaylist::PlaybackMode从当前选中的媒体文件开始列表中的文件顺序播放一次直到最后一个文件

    方法

    返回值类型函数名称描述说明
    booladdMedia(const QMediaContent &content)Public Functions列表添加单个媒体文件
    booladdMedia(const Qlist &items)Public Functions,列表添加多个媒体文件
    intcurrentIndex() const获得当前播放媒体的索引
    QMediaContentcurrentMedia() const

    获得当前播放的媒体列表

    QMediaPlaylist::Erroeerror() const列表错误状态
    QStringerrorString() const播放列表错误字符串信息
    boolinsertMedia(int pos, const QMediaContent &content)向播放列表插入一个媒体文件
    boolinsertMedia(int pos, const QList &items)向播放列表插入多个媒体文件
    boolisEmpty() const清空列表
    boolisReadOnly() const清空列表
    voidload(const QNetworkRequest &request, const char *format=nullptr)加载网络媒体
    voidload(const QRul &location, const char *format=nullptr)加载本地媒体文件
    voidload(QIODevice *device, const char *format=nullptr)加载IO设备文件
    QMediaContentmeida(int index) const获得指定索引的媒体文件

    int

    mediaCount() const统计播放列表的文件数量
    boolmoveMedia(int from, int to)根据位置参数移动媒体文件
    intnextIndex(int steps=1) const当前播放文件的下一个文件索引
    PlaybackModeplaybackMode() const获取列表播放模式
    intpreviousIndex(int steps=1) const当前播放文件的上一个文件索引
    boolremoveMedia(int pos)删除列表中指定位置的文件
    boolremoveMedia(int start, int end)删除列表中start到end之间的文件
    boolsave(const QUrl &location, const char *format=nullptr)保存列表QUrl指定位置
    boolsave(QIODevice *device, const char *format)保存列表到IO设备
    voidsetPlaybackMode(QMediaPlaylist::PlaybackMode mode)设置列表播放模式

    槽函数

    返回值类型函数名称描述说明
    voidnext()下一个文件
    voidprevious()上一个文件
    voidsetCurrentIndex(int playlistPosition)设置当前播放媒体的所有
    voidshuffle()媒体顺序洗牌重建媒体的索引

    信号

    返回值类型函数名称描述说明
    voidcurrentIndexChanged(int position)当前索引改变信号
    voidcurrentMediaChanged(const QMediacontent &content)当前媒体文件改变信号
    voidloadFailed()加载失败信号
    voidloaded()加载完成信号
    voidmediaAboutToBeInserted(int start, int end)媒体即将插入信号
    voidmediaAboutToBeRemoved(int start, int end)媒体即将被删除信号
    voidmediaChanged(int start, int end)媒体文件改变信号
    voidmediaInserted(int start, int end)媒体文件插入信号
    voidmediaRemoved(int start, int end)媒体文件删除信号
    voidplaybackModeChanged(QMediaPlaylist::PlaybackMode mode)列表播放模式改变信号

    2.4 QML 相关用法

    2.4.1 MediaPlayer

    import QtMultimedia 5.0
    
    MediaPlayer {
            id: player;
            source: control.source
            onPositionChanged:
            {
               
            }
    
            onError: {
                console.error("MediaPlayer error:",errorString)
            }
    
            onPlaying:
            {
            }
    
            onStatusChanged:
            {
                console.warn("onStatusChanged",status);
            }
    
            onPlaybackStateChanged:
            {
            }
    
    		onMediaObjectChanged: {       
            }
       }
    

    2.4.2 QML Audio

     Text {
          text: "Click Me!";
          font.pointSize: 24;
          width: 150; height: 50;
    
          Audio {
              id: playMusic
              source: "music.wav"
          }
          MouseArea {
              id: playArea
              anchors.fill: parent
              onPressed:  { playMusic.play() }
          }
      }
    

    2.4.3 QML Video

    Video 是一种方便的类型它将MediaPlayer的功能和视频输出结合在一起。它提供了简单的视频播放功能无需声明多种类型。

     Video {
          id: video
          width : 800
          height : 600
          source: "video.avi"
    
          MouseArea {
              anchors.fill: parent
              onClicked: {
                  video.play()
              }
          }
    
          focus: true
          Keys.onSpacePressed: video.playbackState == MediaPlayer.PlayingState ? video.pause() : video.play()
          Keys.onLeftPressed: video.seek(video.position - 5000)
          Keys.onRightPressed: video.seek(video.position + 5000)
      }
    

    3. 遇到的bug

    特定版本5.10

    3.1 调整倍速不起作用

    调整播放倍速时不起作用后来通过重新设置下seek进度来解决了。

    function setPlayerSpeed(speed)
        {
            var num = parseFloat(speed.slice(0,speed.length-1))
            player.playbackRate = num
            console.log("setPlayerSpeed",num)
            player.seek(player.position - 1000);
        }
    

    3.1 当弱网情况下拖动进度条导致UI卡主

    1 是通过优化进度条的通知时机 比如 信号 moved
    2 是通过媒体的状态flage 来展示loading 进行优化

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    “Qt 之 MediaPlayer 音视频播放” 的相关文章

    【Developer Log】开发日志

    keystone 了解和使用keystone(六)创建service和endpoint 2016.9.10 了解和使用keystone(五)获取token 2016.9.10 了解和使用keystone(四)创建普通用户 2016.9.10 了解和使用...

    Linux目录操作命令

    pwd: 显示当前工作目录名格式:pwd [option]     其中选项可为:   -P一只显示实际目录,不显示符号连接。   -L可以显示符号连接的目录。   %pwd  /*显示出当前用户的工作目录名称*/  cd:改变当...

    Google Earth Engine(GEE)——python导出 GeoTIFF 文件

    处理地球引擎数据集后,您可能需要将结果导出ee.Image到 GeoTIFF。例如,将其用作 Earth Engine 外部数值模型的输入,或将其与您喜欢的 GIS 中的个人地理参考文件重叠。有多种方法可以做到这一点(请参阅开发人员指南的导出部分)。在这里,我们探索两种选择: ee.Image...

    Python简单的测试题有哪些 - 开发技术

    本篇内容介绍了“Python简单的测试题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 以下代码的输出结果为:print(round(-3.6))A.-4B.-...

    PYTHON前端几个框架的比较

    一、概述   我准备做一个个人站把这些年积累的文章整理下、汇总下最近python用的多就想看看万能的python现在能不能做网站了后台当然我们知道是有的前端之前是没有的结果这一搜还真有了几个框架   Streamlit、Brython、remi、pywebio   我的需求就是常规个人站然后需...

    怎么使用Lambda表达式简化代码提高生产力 - 开发技术

    这篇文章主要介绍“怎么使用Lambda表达式简化代码提高生产力”,在日常操作中,相信很多人在怎么使用Lambda表达式简化代码提高生产力问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Lambda表达式简化代码提高生产力”的疑惑有...