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 音视频播放” 的相关文章

    Java: Course2

    一 . static的使用:1 .修饰变量: (静态变量)可以在对象之间共享值2 .修饰函数(静态函数)被static修饰过的函数只能调用被static修饰过的变量或方法,不能以任何方式引用this或super。被static修饰的变量或函数也可以添加权限修饰符(private,public..)。...

    如何用php搭建服务器 - 编程语言

    这篇“如何用php搭建服务器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用php搭建服务器”文章吧。 一、了解PHP语...

    不同类型库创建临时表

    今天工作中写脚本需要创建临时表,之前只知道创建语法,一些细节的问题用到的时候发现还是有些拿捏不准,特此学习记录。一、hivehive创建临时表有两种方式第一种使用with aswith as 也叫做子查询部分WITH t1 AS (        SELEC...

    怎么在python中创建单元测试 - 编程语言

    本篇内容主要讲解“怎么在python中创建单元测试”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在python中创建单元测试”吧! 让我们先从为什么要做测试开始:1、减少手动测试的需求因为测...

    vue如何将字符串转化为整数 - web开发

    这篇文章主要介绍“vue如何将字符串转化为整数”,在日常操作中,相信很多人在vue如何将字符串转化为整数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何将字符串转化为整数”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!...

    Codeforces Beta Round #75 (Div. 2) / 92B Binary Number(贪心)_贪心java

    B. Binary Number http://codeforces.com/problemset/problem/92/B time limit per test memory limit per test input...