第七章:ffmpeg和QT开发播放器之视频播放控制(1)

写在前面:

    这部分对应视频课程中的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);
}

       编译完成后,视频的进度条就可以动起来了。





猜你喜欢

转载自blog.csdn.net/tainjau/article/details/79846560