第十三章 音视频播放——Qt

要使用多媒体模块的内容,则需要在.pro项目文件中添加代码:QT += multimedia
多媒体功能键及相关C++类:

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

一、播放音频

1.播放压缩音频

使用方法:

  • 创建QMediaPlayer对象
  • 设置媒体源,setMedia(); 或者其他属性;
  • 播放,play()。
2.低延迟声音效果

QSoundEffect类可以使用一种低延迟方式来播放未压缩的音频文件,相应的要比QMediaPlayer占用的资源多。
使用方法与上相同。

二、播放视频

1.播放视频文件

可以通过QMediaPlayer进行播放,但是要在界面上显示视频内容,需要借助QVideoWidget或者QGraphicsVideoItem类。
QVideoWidget继承自QWidget,将它指定为QMediaPlayer的视频输出窗口后,就可以显示播放的视频画面;如果不为播放器设置视频输出界面,播放器也可以播放视频,不过只有声音而不会显示图像。使用QVideoWidget可以设置视频的亮度、对比度、色相和饱和度,还可以全屏显示,并且为这些功能设置了相应的信号与槽。
QGraphicsVideoItem继承自QGraphicsWidget,它提供了一个窗口并可以作为一个图形项嵌入到场景中显示视频内容。

2.使用QMovie播放GIF文件

QMovie使用QImageReader来播放没有声音的动画,比如GIF格式的文件,其支持的格式可以使用QMovie::supportedFormats()静态函数获取。
要播放一个动画,只需要先创建一个QMovie对象,并为其指定要播放的动画文件,然后将QMovie对象传递给QLabel::setMovie()函数,最后调用start()函数来播放动画。
QMovie一共有3个状态,每当状态改变时都会发射stateChanged()信号,可以关联这个信号来改变播放、暂停等按钮的状态。

QMovie的不同状态:
	常量				描述
	QMovie::NotRunning	动画未执行。这个QMovie的初始状态,如果调用了stop()函数或者动画已经结束,则会进入该状态
	QMovie::Paused		动画被暂停。调用setPause(true)函数后进入该状态,且保持当前的帧号,调用setPause(false)函数会继续播放下一帧
	QMovie::Running		动画正在播放

相关函数:

setPaused(true):暂停动画的播放;
setPause(false):恢复播放;
stop():停止动画的播放;
frameCount():获取当前动画总的帧数;
currentFrameNumber():返回当前帧的序列号,动画第一个帧的序列号为0;
currentImage()或者currentPixmap():获取当前帧的一个副本;(如果动画播放到了一个新的帧,QMovie会发射update()信号)
setCacheMode():设置QMovie的缓存模式,有两个选项,QMovie::CacheNone和QMovie::CacheAll,前者是默认选项,不缓冲任何帧,后者是缓存所有的帧;
jumpToFrame():跳转到指定的帧;(指定了QMovie::CacheAll选项)
setSpeed():设置动画的播放速度,该速度是以原始速度的百分比来衡量的,默认的速度为100%。

三、QMediaPlayer

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

play():播放;
pause():暂停;
stop():停止;
currentMedia():获取当前进行播放的媒体内容,返回类型是QMediaContent;
duration():获得当前媒体的时长;
position():获取当前的播放位置,单位均为毫秒;
setPosition():跳转到一个播放点,通过关联positionChanged()信号可以随时获取播放进度;
volume():获取当前的播放音量,其范围为0~100,
setVolume():设置音量大小,而当音量改变时会发射volumeChanged()信号,
setMuted():设置为静音
1.播放状态

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

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

当播放器发生错误时会发射error()信号,通过关联该信号可以对相应的错误进行处理。
播放器会出现6种不同的错误情况,这6种情况由QMediaPlayer::Error枚举类型定义。
播放器的各种错误情况:

常量								|描述
————————————————————————————————————|————————————————————————————————————————————————————————————————
QMediaPlayer::NoError				|没有发生错误
————————————————————————————————————|————————————————————————————————————————————————————————————————
QMediaPlayer::ResourceError			|媒体资源无法被解析
————————————————————————————————————|————————————————————————————————————————————————————————————————
QMediaPlayer::FormatError			|媒体格式不(完全)支持,可能依然可以播放,但是会减少声音或者图像
————————————————————————————————————|————————————————————————————————————————————————————————————————
QMediaPlayer::NetworkError			|发生了一个网络错误
————————————————————————————————————|————————————————————————————————————————————————————————————————
QMediaPlayer::AccessDeniedError		|没有相应的权限来播放媒体资源
————————————————————————————————————|————————————————————————————————————————————————————————————————
QMediaPlayer::ServiceMissingError	|没有发现有效的播放服务,无法进行播放	
—————————————————————————————————————————————————————————————————————————————————————————————————————

QMediaPlayer进行播放时拥有3种状态,它总是处于这3种状态的其中一种。
这3种状态由QMediaPlayer::State枚举类型定义。
无论其先前处于什么状态,当播放器的状态发生改变时就会发射stateChanged()信号,可以通过关联该信号来获取播放器当前的状态。
播放器的各种状态:

常量						|描述 
————————————————————————————|———————————————————————————————————————————————————————————————————————————————————————————————
QMediaPlayer::StoppedState	|停止状态。处于该状态时,播放器会从当前媒体的开始进行播放。
							|调用stop()函数可以直接进入该状态
————————————————————————————|———————————————————————————————————————————————————————————————————————————————————————————————							
QMediaPlayer::PlayingState	|播放状态,媒体器正在播放媒体内容。调用play()函数可以直接进入该状态 
————————————————————————————|———————————————————————————————————————————————————————————————————————————————————————————————
QMediaPlayer::PausedState	|暂停状态,播放器暂停当前的播放。处于该状态时播放器会从当前媒体暂停的位置进行播放,调用pause()
							|函数可以直接进入暂停状态
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————		
2.获取媒体元数据

可以使用QMediaPlayer的metaData()函数来获取媒体的元数据。
每当QMediaPlayer对媒体源进行解析,元数据可用时都会发射metaDataAvailableChanged()信号,可以关联该信号来获取当前媒体的相关信息。
需要注意,如果要获取媒体元数据,那么使用setMedia()设置媒体源时,一定要使用绝对路径,使用相对路径无法获取元数据。

3.播放列表

QMediaPlaylist类提供了一个播放列表,它其实是一个QMediaContent对象列表,并包含了一些实用功能,QMediaPlayer可以通过setPlaylist()来设置一个播放列表。
相关函数:

addMedia():添加一个QMediaContent对象或者添加一个QMediaContent对象列表作为媒体源;
insertMedia():将媒体插入到列表任意位置;
load():加载网络资源;
mediaCount():获取列表中媒体的数量;
currentMedia():获取当前的媒体;
removeMedia():设置删除一个媒体;
lear():清空整个播放列表;

next()、previous()、setCurrentIndex()、shuffle()等槽来指定播放列表中的条目进行播放,每当播放列表中当前位置变化时都会发射currentIndexChanged()信号。
QMediaPlaylist中的setPlaybackMode()可以设置播放模式,由QMediaPlaylist::PlaybackMode枚举类型进行定义,一共包含5种。
播放列表的播放模式

常量								|描述 
————————————————————————————————————|—————————————————————————————————————————————————————————————————————————————————————
QMediaPlaylist::CurrentItemOnce		|当前项只播放一次
————————————————————————————————————|—————————————————————————————————————————————————————————————————————————————————————
QMediaPlaylist::CurrentItemLoop		|当前项进行循环播放
————————————————————————————————————|—————————————————————————————————————————————————————————————————————————————————————
QMediaPlaylist::Sequential			|默认值。从当前项开始顺序播放,直到列表最后一项播放结束后停止。最后一项的下一项为NULL
————————————————————————————————————|—————————————————————————————————————————————————————————————————————————————————————
QMediaPlaylist::Loop				|播放完最后一项会从头开始循环播放
————————————————————————————————————|—————————————————————————————————————————————————————————————————————————————————————
QMediaPlaylist::Random				|随机播放
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值