QMediaPlayer集成了底部包括音频输出和音频文件读取等等操作,是一个高层次的,封装好的播放器内核,通过调用它,你可以实现输入任意格式的视频、音频播放,并实现对其播放状态的调整。
下面我们用QMediaPlayer来播放一段音乐,顺便体会一下它有多么方便。
player = new QMediaPlayer;
player->setMedia(QMediaContent(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3")));
player->play();
第一步:创建QMediaplayer对象;第二步:设置当前播放的媒体文件;第三步:播放。
三行代码足矣。
可能有细心的朋友发现QUrl后面跟着fromLocalFile,对的,这是本地的媒体文件。那么网络上的呢?
答案是:也可以!而且不需要去考虑诸如音频流的输入和处理问题,QMediaPlayer已经帮我们做好了。
下面我们就来详细的看一下QMediaPlayer能够帮助我们做什么。
首先,看一下QMediaPlayer中的几个重要属性
属性 | 类型 | 说明 |
---|---|---|
duration | qint64 | 当前播放媒体对象的持续时间(毫秒) |
mediaStatus | MediaStatus | 当前媒体的状态,枚举类型,之后说明 |
state | State | 当前的播放状态,枚举类型,之后说明 |
muted | bool | 是否静音 |
playlist | QMediaPlaylist | 当前的播放列表,之后说明 |
position | qint64 | 保存当前播放的进度(毫秒) |
volume | int | 当前的音量 |
这些属性都可以通过get和set方法来进行设置和获取。例如获取媒体对象播放进度的方法是QMediaPlayer::position()。该方法返回一个qint64(64位整数,可以近似理解为int)类型。设置进度的方法是QMediaPlayer::setPosition(qint64 position)。
设置当前播放媒体的方法是QMediaPlayer::setMedia(QMediaContent &media,QIODevice *stream = QNULLPTR)。
第二个参数默认即可。第一个参数是一个QMediaContent对象,封装了媒体文件信息。这个对象可以通过QMediaContent(QUrl url)来创建。QUrl可以是一个本地的文件,也可以是网络上的文件。
切换播放状态的的方法有QMediaPlayer::play(),QMediaPlayer::pause,QMediaPlayer::stop();三个,看名字就能知道什么意思对吧。
再说说QMediaPlayer中定义的两个重要的枚举类型State和MediaStatus
State包含着当前的播放状态,有 { StoppedState, PlayingState, PausedState }三种状态,可以通过state()函数获取。
MediaStatus包含当前媒体文件的有效性,有 { UnknownMediaStatus, NoMedia, LoadingMedia, LoadedMedia, …, InvalidMedia }等状态,可以通过mediaStatus()方法获取。
上述的每个属性,在QMediaPlayer类中都有与之对应的on****changed信号。通过绑定信号,就可以实现对QMediaPlayer状态的监控,比如进度条自动移动等。
QVideoWidget是一个用来展示视频的控件。
要使用它,需要先定义一个QMediaPlayer,然后将QMediaPlayer的VideoOutput设置为QVideoWidget对象即可。
player = new QMediaPlayer;
player->setMedia(QMediaContent(QUrl("http://example.com/myclip2.mp4")));
videoWidget = new QVideoWidget;
player->setVideoOutput(videoWidget);
videoWidget->show();
player->play();
同样从属性去解读这个类
属性 | 类型 | 说明 |
---|---|---|
brightness | int | 亮度 |
hue | int | 色调 |
contrast | int | 对比度 |
fullScreen | bool | 是否全屏 |
saturation | int | 饱和度 |
和QMediaPlayer一样,通过设置这些属性就可以实现相应的功能……
好的解读完成……
没错就那么简单
QMediaPlaylist是一个列表,它可以保存媒体文件,包括媒体路径等信息,它具有着列表的性质,比如添加删除插入等,但它能做的,比单纯的储存要多得多。设置播放顺序,对播放的控制,保存到本地,从本地读取,都可以很方便地实现。
用QMediaPlaylist添加媒体文件可以使用addMedia方法。方法接收一个QMediaContent的对象引用。
playlist->addMedia(QMediaContent(QUrl("http://example.com/movie1.mp4")));
playlist->addMedia(QMediaContent(QUrl("http://example.com/movie2.mp4")));
playlist->addMedia(QMediaContent(QUrl("http://example.com/movie3.mp4")));
此时新添加的媒体被插入到列表的最后。
同样的也有指定位置的插入方法。除了QMediaContent对象引用,还需要指定插入位置。
playlist->insertMedia(2,QMediaContent(QUrl("http://example.com/movie4.mp4")));
方法clear()可以清除所有的媒体对象。
而希望精确地删除媒体,就要用到removeMedia方法。方法有两个版本,第一个版本接收一个int变量作为被删除媒体的位置,另一个版本接收两个int变量,删除这两个索引之间的所有媒体对象。
playlist->removeMedia(3);//删除位置索引为3的媒体对象
playlist->removeMedia(0,2);//删除位置索引为0,1,2的媒体对象;
playlist->clear();//清空列表
这是一些很简单的list的操作。下面讲讲身为Playlist的高级操作。
我们知道,现在的播放器一般都有选择播放顺序的功能,除了最基本的顺序播放,还有单曲循环、随机播放等模式。现在只需要调用setPlaybackMode(PlaybackMode mode)这个方法,就可以设置播放顺序。
方法接收枚举类型PlaybackMode作为播放顺序。
名称 | 枚举值 | 说明 |
---|---|---|
QMediaPlaylist::CurrentItemOnce |
0 |
单曲播放 |
QMediaPlaylist::CurrentItemInLoop |
1 |
单曲循环 |
QMediaPlaylist::Sequential |
2 |
顺序播放 |
QMediaPlaylist::Loop |
3 |
列表循环 |
QMediaPlaylist::Random |
4 |
随机播放 |
调用next()和previous()方法,可以实现按照播放模式进行当前播放的手动切换。当一个媒体播放完毕时,会自动地调用next()方法。
将一个QMediaPlaylist设置进QMediaPlayer
player.setPlaylist(playlist);
player.play();//播放playlist当前媒体