写在前面:
这部分对应视频课程中的4-1~4-3。主要实现了对视频总时间和当前时间的显示,以及视频进度条的显示。1、添加播放时间进度条
如何得知当前播放进度呢?
通过视频帧和总时间的比较来知道当前视频播放到哪个位置。
进入qt编辑器中,拖动label来创建一个播放时间的显示,然后单击右键,选择“编辑式样表”,再选择添加颜色,这里选择白色,这样我们就可以看到时间了。
设置好播放时间窗口的大小之后,记得在对象查看器中给这个控件一个名字。
2、视频总时间的显示
那么接下来就要对显示时间做处理了,分为两步,第一步显示视频播放的总时长,第二步则是视频当前时间。
改动open函数,返回值改成之前计算出来的totalMs。
通过open函数返回值获取到totalMs视频总时间,调用ui.totaltime->setText打印出时间信息。int totalMs = XFFmpeg::Get()->Open(name.toLocal8Bit());
char buf[1024] = { 0 };
int min = (totalMs / 1000) / 60;
int sec = (totalMs / 1000) % 60;
sprintf(buf,"/%d:%d",min,sec);
ui.totaltime->setText(buf);
3、视频当前时间显示
先在XFFmpeg.h中的public中添加一个变量pts用于记录当前视频播放的位置。
在Decode解码函数最后面,也就是解码成功后pts = yuv->pts*r2d(ic->streams[pkt->stream_index]->time_base);记录pts.
之后使用定时器来刷新秒数,创建定时器void timerEvent(QTimerEvent *e);Xplay::Xplay(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
startTimer(40); //启动定时器 40ms
}
void Xplay::timerEvent(QTimerEvent *e)
{
char buf[1024] = { 0 };
int min = (XFFmpeg::Get()->pts / 1000) / 60;
int sec = (XFFmpeg::Get()->pts / 1000) % 60;
sprintf(buf, "%03d:%02d", min, sec);
ui.playtime->setText(buf);
}
4、进度条显示播放进度
在左侧工具栏中选择Horizontal Line,拖动到QT界面。
点击进度条,然后在右侧属性编辑器中,调整进度条的参数,提高进度条的精度
然后记得修改这个控件的名字,以便后面使用
最后在之前的timerEvent函数后面添加
if (XFFmpeg::Get()->totalMs > 0)
{
float rate = (float)XFFmpeg::Get()->pts / (float)XFFmpeg::Get()->totalMs;
ui.playslider->setValue(rate * 1000);
}
编译完成后,视频的进度条就可以动起来了。