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()来跳转到指定的帧了。