音、视频播放

Qt5使用全新的Qt Multimedia模块来实现多媒体应用。使用时需要在工程文件中加上

QT += multimedia

一些常见的多媒体功能类有

功能 C++类
播放音效 QSoundEffect
播放低延迟音频 QAudioOutput
播放编码音频(mp3等) QMediaPlayer
访问原始音频输入数据 QAudioInput
录制原始音频设备 QAudioDeviceInfo
录制编码音频数据 QAudioRecorder
播放视频 QMediaPlayer,QVideoWidget,QGraphicsVideoItem
处理视频 QMediaPlayer,QAbstractVideoSurface,QVideoFrame
收听录音机 QRadioTuner,QRadioData
访问相机取景器 QCamera,QVideoWidget,QGraphicsVideoItem
处理取景器 QCamera,QAbstractVideoSurface,QVideoFrame
拍摄照片 QCamera,QCameraImageCapture
拍摄视频 QCamera,QMediaRecorder

Qt的多媒体接口建立在底层平台的多媒体框架之上,这就意味着对于各种编解码器的支持依赖于使用的平台。

低延迟声音效果

QSoundEffect类可以使用一种低延迟方式来播放未压缩的音频文件,如WAV文件,它非常适合用来播放与用户交互时的音效,如弹出框提示音,虚拟键盘按键音,游戏音效等。如果不需要低延迟效果,那么最好使用QMediaPlayer来播放音频,因为其支持更多的媒体格式并且占用资源更少。使用方式:

QSoundEffect *effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile("../sound.wav"));  //设置播放的文件
effect->setVolume(0.25f);  //设置声音大小,取值范围0.0-1.0间
effect->setLoopCount(QSoundEffect::Infinite);  //设置播放次数

QMediaPlayer的使用

QMediaPlayer被设计用来进行媒体播放,可以播放音频,视频和网络广播等,播放音频很简单:

player=new QMediaPlayer;
player->setMedia(QUrl::formLocalFile("../song.mp3"));
player->play();

如果要播放网络歌曲,则只需要将地址修改为QUrl网络地址即可。QMediaPlayer支持的音频文件格式取决于操作系统环境以及用户安装的媒体插件。

视频文件可以通过QMediaPlayer进行播放,但是要在界面上显示视频内容,需要借助QVideoWidget或者QGraphicsVideoItem类,这两个类都属于Qt MultimediaWidget模块,QVideoWidget继承自QWidget,所以它可以作为一个普通窗口部件进行显示,也可以嵌入到其他窗口中,将QVideoWidget指定为QMediaPlayer的视频输出窗口后,就可以显示播放的视频画面了。

要使用QMediaPlayer进行播放,需要先使用setMedia(const QMediaContent&media,QIODevice stream=0)槽来设置媒体源,其中,QMediaContent提供了对媒体源的访问,它包含了媒体源的URL和格式信息,一般对于本地媒体只需要指定路径即可,如果这里提供了一个媒体流stream,那么将会直接从流中读取媒体数据而不再对媒体进行解析。

当使用setMedia()设置了媒体源后,函数会直接返回,并不等待媒体加载完成,也不会检查可能存在的错误,当媒体的状况发生改变时播放器会发射mediaStatusChanged()信号,可以通过关联该信号来获取媒体加载的一些信息。媒体状况有如下:

常量 描述
QMediaPlayer::UnknownMediaStatus 媒体的状况无法确定
QMediaPlayer::NoMedia 当前媒体不存在时,播放器处于停止状态
QMediaPlayer::LoadingMedia 当前媒体正在被加载时,播放器可以处于任何状态
QMediaPlayer::LoadedMedia 当前媒体已经加载完成时,播放器处于停止状态
QMediaPlayer::StalledMedia 没有足够的缓冲或者其他临时中断,而导致当前媒体的播放处于停滞
QMediaPlayer::BufferingMedia 播放器正在缓冲数据,但已经缓冲了足够的数据以便稍后继续播放
QMediaPlayer::BufferedMedia 播放器已经完全缓冲了当前媒体
QMediaPlayer::EndOfMedia 已经播放到了当前媒体的结尾时,播放器处于停滞
QMediaPlayer::InvalidMedia 当前媒体无法播放时,播放器处于停止

当播放器发生错误时会发射error()信号,主要有6种不同的错误情况

常量 描述
QMediaPlayer::NoError 没有发生错误
QMediaPlayer::ResourceError 媒体资源无法被解析
QMediaPlayer::FormatError 媒体格式不支持
QMediaPlayer::NetworkError 发生了网络错误
QMediaPlayer::AccessDeniedError 没有相应的权限来播放媒体资源
QMediaPlayer::ServiceMissingError 没有发现有效的播放器服务

可以使用QMediaPlayer的metaData()函数来获取媒体的元数据,每当QMediaPlayer对媒体进行解析,元数据可用时都会发射metaDataAvailableChanged()信号,可以关联该信号来获取与媒体的相关信息。

void MainWindow::metaDataAvailableChanged(bool available)
{
    if(available){
        QString title=player->metaData("Title").toString();
        QString author=player->metaData("Author").toString();
     }
}

如果要获取媒体元数据,那么使用setMedia()设置媒体源时一定要使用绝对路径,使用相对路径将无法获取。

QMediaPlaylist类提供了一个播放列表,它其实是一个QMediaContent对象列表,并包含了一些实用的功能。可以通过setPlaylist()来设置一个播放列表,通过addMedia()来添加一个QMediaContent对象或者添加一个QMediaContent对象列表作为媒体源,也可以通过insertMedia()将媒体插入到列表任意位置,或者使用load()函数来加载网络资源。

QMediaPlaylist中的setPlaybackMode()可以设置播放模式,由QMediaPlaylist::PlaybackMode枚举类型进行定义,有

常量 描述
QMediaPlaylist::CurrentItemOnce 当前项只播放一次
QMediaPlaylist::CurrentItenInloop 当前项进行循环播放
QMediaPlaylist::Sequential 默认值,从当前项开始循环播放
QMediaPlaylist::Loop 播放完最后一项会从头开始循环播放
QMediaPlaylist::Random 随机播放
playlist = new QMediaPlaylist;
playlist->addMedia(QUrl::fromLocalFile("E:/song.mp3"));
playlist->setCurrentIndex(0);
playlist->setPlaybackMode(QMediaPlaylist::Loop);
palyer->setPlaylist(playlist);

QMovie类不属于多媒体模块,而是包含在Qt GUI模块中,它使用QImageReader类来播放没有声音的动画,动画的第一个帧的序列号为0,如果动画播放到了一个新的帧,QMovie会发射updated()信号,这是可以使用currentImage()或者currentPixmap()函数来获取当前帧的一个副本,还可以使用setCacheMode()来设置QMovie的缓存模式,有QMovie::CacheNone和QMovie::CacheAll,前者是默认,不缓冲任何帧,后者缓冲所有帧,缓冲了所有帧就可以使用jumpToFrame()来跳转到指定的帧了。

猜你喜欢

转载自blog.csdn.net/weixin_38893389/article/details/81808657