视频播放帧率的问题

baidu_34630879 2016-11-25 04:39:50
视频播放的时候帧率是如何控制的?
比如Opencv,每次读一个mat对象,处理后再显示出来。一个每秒24帧的视频,按照普通方法应该是设置一个定时器,到时间后处理一个mat对象,24帧也就是46.6毫秒处理一个mat。可是这样就要考虑46.6毫秒内程序能不能处理完这个mat并让它显示。请问像大型播放器是如何做精准的帧率控制的?难道是预先处理了放那里等着显示?但是预留的时间总会用完的。谢谢!
...全文
733 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2016-11-25
  • 打赏
  • 举报
回复
opencv做一些人脸识别是有一些延迟的,一两秒似乎都算正常的吧。 高级的face++什么的人家弄的延迟比较小,这个都是核心算法,做了很多优化,希望有高手过来给我们分享一下
BeanJoy 2016-11-25
  • 打赏
  • 举报
回复
引用 2 楼 baidu_34630879 的回复:
[quote=引用 1 楼 BeanJoy 的回复:] 我猜想可以这样: [此处省略。。。]后继续播放。
感谢回复! 你所提出这两个方法都是要付出丢帧的代价,每秒24帧已经是极限了,否则会有“卡顿”现象。另外,我测试一个mat做人脸识别需要200毫秒以上,整个视频必须每个mat都做识别处理,才不会有遗漏。[/quote] 我说的是视频播放的方式,不包括人脸识别。 如果处理每帧人脸识别都要耗时200ms左右,你可能需要考虑另外的方式。可以先走个流程,先处理视频每帧的人脸识别,然后再播放,播放的时候将之前的处理结果叠加到视频上即可。
baidu_34630879 2016-11-25
  • 打赏
  • 举报
回复
引用 1 楼 BeanJoy 的回复:
我猜想可以这样: [此处省略。。。]后继续播放。
感谢回复! 你所提出这两个方法都是要付出丢帧的代价,每秒24帧已经是极限了,否则会有“卡顿”现象。另外,我测试一个mat做人脸识别需要200毫秒以上,整个视频必须每个mat都做识别处理,才不会有遗漏。
BeanJoy 2016-11-25
  • 打赏
  • 举报
回复
我猜想可以这样: 记下开始播放的时间点A,然后开个定时器,每隔46.6毫秒响应一次。响应时,时间点为B,然后计算(B-A)的时长,然后计算这个时候实际应该播放第几帧画面,而并不是依次播放每一帧画面。正常情况下,每一帧都可以播放。如果处理某一帧太费时,比如某一帧就处理了1秒,那么下一次播放就不应该播放下一帧,而是应该播放此时应该播放的那一帧。 这样,如果播放一部2小时的电影,那么肯定是会有2小时内播放完,而且每隔46.6毫秒刷新一帧。 以上是一种方案,但还可以是这样: 播放完一帧后,计算下一帧应该是什么时候开始播放,比如下一帧应该再等45毫秒再播放,那么就Sleep(45),然后开始播放下一帧。但如果这一帧处理时间过长,而计算出来下一帧应该等待播放的时间却为负的,那么就不应该播放下一帧,也不应该Sleep,而需要直接再计算播放下下帧需要等待播放的时间,如果等待时间为0,直接播放,等待时间为正数,直接Sleep,然后继续播放。
一、问题的提出 做运动分析检测,需要有一定的素材视频,但是素材视频的编码OpenCV不能识别,无法对指定的视频做实验,怎么素材视频通用化使得OpenCV能正常识别? 二、解决的方法 (1)素材视频总是有配套的播放器来播放,那么使用这个播放器查看总帧数,和总播放时长,计算出帧率为25,表示一秒钟播放25帧图像。 (2)用这个配套的播放器对素材视频进行逐帧步进抓图,这个操作很辛苦,一秒钟25帧,那么抓25帧是一秒,素材视频30秒就要抓750帧,很辛苦。 (3)帧抓完后,发现一帧图1.4M,以位图格式保存,那么30秒就要达到1G的存储空间,怎么办?没办法,不知道怎么去获取解码器和安装解码器,就只能这么忍受。察看到逐帧步进抓图的存储是按序列编排文件名,那么要修改好使得每个文件名都是以规则“文件名”+“帧序列”的形式存在。 (4)编写根据帧序列图生成帧率25的视频的代码 三、问题的解决: (1)解决一个字符串合并的问题: 由于字符串参数有个赋值格式化设置函数叫做Format,要实现多类型参数的字符串化,可以参照如下示例: float f = 0.0; char sz[128]; int n = 1; CString str; str.Format("%f%s%d",f,sz,n); (2)采用MJPG的编码格式依次将这些图像序列写入到视频中保存起来,采用MJPG的编码格式是因为操作系统自带了Media player播放器,这种编码格式属于无压缩的,Media player可以识别播放。 (3)实现方式是使用MFC对话框窗体的按钮事件来进行视频的逐帧写图,由于帧数多,那么在写入器循环做写这个动作的时候,整个程序是假死在那里直到写入器的写入操作终结。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧