Frame Rate

帧率代表的是每一秒所播放的视频图像数目。通常,视频都会有固定的帧率,具体点地说是每一帧的时间间隔都是一样的,这种情况简称为CFR(Constant Frame Rate);另外一种情况就是每一帧的时间间隔不一定相同,即可变帧率,简称为VFR(Variable Frame Rate),现在也有些录像设备支持录制VFR视频了,在录制具有大量静止场景的视频时,采用VFR能降低录制出来的视频的容量大小。

PTS

通过上文对帧率的描述,我们知道在进行视频播放时,每一帧都应该有自己的播放时刻。不过视频文件中不会直接存放帧的播放时刻,为了保证精度以及节省存储空间,文件中会存储每一帧的PTS(Presentation Time Stamp)以及一个名为time base的参数,PTS是整数,而time base是小数,通过PTS与time base相乘,就能得到视频的播放时刻,单位为秒。大部分的视频格式都支持存放帧的PTS,而在播放的时候,通过对PTS进行计算就能使得视频的每一帧都在合适的时间显示。通常,第一帧的PTS为0。

同步流程

视频帧有固定的输出时间的话,意味着在解码完成一帧之后,需要进行等待,等到合适的时间才能进行帧的显示。

上图为一个视频帧的解码、显示循环。在解码完成一帧后,需要获得当前时间以及当前帧的显示时间,两者的时间差就是需要睡眠的时长。

不过由于我们常用的操作系统为非实时系统,因此如果希望执行短时间的休眠,调用sleep通常不会得到非常满意的结果。解决方法就是通过多次休眠更短的时间段,并在被唤醒过后检查是否已经超时,超时即可进行视频帧的输出。

            //Decode video frame
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
if(frameFinished){
memcpy(Display.YPlane, pFrame->data[0], bufsize);
memcpy(Display.UPlane, pFrame->data[1], bufsize/4);
memcpy(Display.VPlane, pFrame->data[2], bufsize/4); vs.frame_last_pts = vs.frame_cur_pts;
vs.frame_cur_pts = pFrame->pts * time_base * 1000000;
pts_delay = vs.frame_cur_pts - vs.frame_last_pts;
vs.cur_display_time = vs.last_display_time + pts_delay;
//vs.last_frame_displayed = 0; if(!vs.is_first_frame){
time = av_gettime_relative();
delay = vs.cur_display_time - time;
while(delay > 0){
if(delay > 10000)
vs.sleep_time = 10000;
else
vs.sleep_time = delay;
av_usleep(vs.sleep_time);
time = av_gettime_relative();
delay = vs.cur_display_time - time;
}
vs.last_display_time = time;
DisplayFrame(&Display);
//vs.last_frame_displayed = 1;
}else{
vs.last_display_time = av_gettime_relative();
DisplayFrame(&Display);
vs.is_first_frame = 0;
//vs.last_frame_displated = 1;
} SDL_PumpEvents();
}

[SimplePlayer] 3. 视频帧同步的更多相关文章

  1. [转]android 获取视频帧

    本文转自:http://blog.csdn.net/heart_Moving/article/details/17414067 今天做Android视频文件解码,需求:从一个视频文件获取到一帧一帧的图 ...

  2. 在TX2上多线程读取视频帧进行caffe推理

    参考文章:Multi-threaded Camera Caffe Inferencing TX2之多线程读取视频及深度学习推理 背景 一般在TX2上部署深度学习模型时,都是读取摄像头视频或者传入视频文 ...

  3. 音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...

  4. 动作手游实时PVP帧同步方案(客户端)

    1.概述 1.1.基于UDP的帧同步方案 在技术选型方面,之所以选择帧同步方案,在Kevin的一篇介绍PVP帧同步后台实现的文章中已经做了详细叙述,这里简单摘要如下: 高一致性.如果每一帧的输入都同步 ...

  5. GJM :动作手游实时PVP 帧同步(客户端)[转载]

    原帖地址:http://gad.qq.com/article/detail/7171195 原文作者:唐声福  原帖备注:版权所有,禁止匿名转载:禁止商业使用:禁止个人使用. 1.概述 1.1.基于U ...

  6. 使用X264编码yuv格式的视频帧使用ffmpeg解码h264视频帧

    前面一篇博客介绍在centos上搭建点击打开链接ffmpeg及x264开发环境.以下就来问个样例: 1.利用x264库将YUV格式视频文件编码为h264格式视频文件 2.利用ffmpeh库将h264格 ...

  7. A TensorBoard plugin for visualizing arbitrary tensors in a video as your network trains.Beholder是一个TensorBoard插件,用于在模型训练时查看视频帧。

    Beholder is a TensorBoard plugin for viewing frames of a video while your model trains. It comes wit ...

  8. 帧同步(LockStep)该如何反外挂

    在中国的游戏环境下,反挂已经成为了游戏开发的重中之重,甚至能决定一款游戏的生死,吃鸡就是一个典型的案例.目前参与了了一款动作射击的MOBA类游戏的开发,同步方案上选择了帧同步技术(LockStep而非 ...

  9. 视频外同步信号研究---fvh

    视频外同步信号研究---fvh 一个时钟周期有两个edge,分别称为:(1)Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候:对于开始电压是0,那么就是0变成 ...

随机推荐

  1. 纯CSS实现点击事件展现隐藏div菜单列表/元素切换

    在写移动端导航的时候经常用到点击按钮出现/隐藏导航条的情况,最常见的方法当然还是前端框架直接调用,省心省力,不易出错:当然还有使用纯JS实现的小代码段.我这里整理了纯CSS实现方式,给需要的人和给自己 ...

  2. SuperMap GIS资料-----云与Web端技术资料集锦

    转自:http://blog.csdn.net/supermapsupport/article/details/70254484 产品白皮书 iServer产品  教学视频  许可说明  安装部署   ...

  3. 配置ADB到Windows环境变量

    adb 命令可以帮我们快速的管理连接的手机设备,例如执行一些安装apk,卸载apk命令,对于熟悉linux系统的人,可以方便的管理手机目录操作手机文件,还可以通过adb命令查看手机的系统日志等操作. ...

  4. 用canvas给视频图片添加特效

    Canvas制作视频图片特效 1. Canvas介绍 1.1Canvas是html5上的一个画布标签,功能有点类似java的swing.可以在canvas上画线条 弧线, 文字 就是画布的功能. 具体 ...

  5. Linux 中使用 firewalld

    firewalld 是一种动态防火墙管理解决方案.Centos 7 默认使用 firewalld.firewalld 是对 iptables 的一个封装,可以让你更容易地管理 iptables 规则. ...

  6. centos7 安装java运行环境

    1.检测是否存在相关历史版本 shell:java-version 1.1.存在相关OpenJDK和其他版本SDK则需要删除,如图. 查看详细信息,命令窗口输入,shell:rpm -qa | gre ...

  7. nginx内置变量总结

    nginx内置变量 2019-02-28 变量名称 变量用途 $atg_PARAMETER      客户端GET请求中   PARAMETER字段的值                        ...

  8. SpringBoot+mybatis使用@Transactional无效

    项目中新增过程中如果出现异常需要回滚, 在service实现方法中使用@Transactional注解失效 解决: 1, 在controller中使用try{}catch捕捉异常 2, 在servic ...

  9. 阿里云上的Centos 7.6的一次Nginx+Mysql+PHP7.3 部署

    阿里云申请了一台服务器 Centos 7.6,每次安装都要上网找一大堆教程,因为不熟悉,因为总是忘记. 所以,有时间的时候,还是记录下自己的学习过程,有助于下次的问题解决. 我先总结下: 1)安装VS ...

  10. Flink Pre-defined Timestamp Extractors / Watermark Emitters(预定义的时间戳提取/水位线发射器)

    https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/event_timestamp_extractors.html 根据官网 ...