因为最近的工作需要从MP4视频中提取一些关键帧,要了解如何将视频的时间点转换为对应的帧号,所以查阅了一些关于视频编解码以及时间同步方式的资料。再此总结一下。

首先是解码,利用FFmpeg解码得到的信息通常如下:

Metadata:
major_brand : isom
minor_version : 512
compatible_brands: mp41
title : Digital Tipping Point
date : 2008
encoder : Lavf51.10.0
comment : license: http://creativecommons.org/licenses/by-sa/3.0/
Duration: 00:03:44.29, start: 0.000000, bitrate: 579 kb/s
Stream #0.0(und): Video: h264, yuv420p, 360×240 [PAR 1:1 DAR 3:2], 511 kb/s, 29.97 fps, 29.97 tbr, 2997 tbn, 59.94 tbc
Stream #0.1(und): Audio: aac, 32000 Hz, stereo, s16, 64 kb/s
Output #0, image2, to ‘?’:
Stream #0.0: Video: mjpeg, yuvj420p, 360×240, q=2-31, 100000 kb/s, 90k tbn, 59.94 tbc

而我只关注了其中部分信息,主要是与帧率和时间同步相关的信息。

  1. 颜色编码:其中YUV420是视频中通常采用的颜色编码方式,Y表示亮度,而U,V则与颜色相关,而420则分别对应着存储相应分量所占用的比特数之比。其实采用这种编码方式就是为了早期彩色电视与黑白电视能更好的相容,更多具体内容参见百度百科相应词条。

  2. 帧率相关信息:
    上例中的fps, tbr, tbn, tbc等参数分别代表的含义如何,如果我要完成时间点与帧号的转换就需要找出合适的参数。参阅了某bbs,得到以下信息:

tbn is the time base in AVStream that has come from the container, I
think. It is used for all AVStream time stamps.

tbc is the time base in AVCodecContext for the codec used for a
particular stream. It is used for all AVCodecContext and related time
stamps.

tbr is guessed from the video stream and is the value users want to see
when they look for the video frame rate, except sometimes it is twice
what one would expect because of field rate versus frame rate.

fps 自然的是 frame per second,就是帧率了。

所以tbn和tbc应该都是在相应层上的时间单元,比如tbn=2997就相当于在视频流层把1s的时间分成了2997个时间单元,如此精细可以更好的与其他流比如音频流同步,对应着fps=29.97就表示每100个时间单元中有一帧。

  1. 时间同步方式:
    问题来了:fps=29.97这是一个小数啊,我如果直接利用公式 frame number = time * fps 得到了也不是一个整数啊,而帧号应该是一个整数才对。

首先,29.97f/s这个变态的数是如何得到的?这起源于早期的NTSC电视制式,而现代的数字编码只是为了兼容而沿用了它的标准。其实在标准制定 时,NTSC采用的是30f/s的帧率,只是后来為了消除由彩色信号及伴音信号所產生的圖像干擾,每秒幀幅由30幀稍微下調至29.97幀,同時線頻由 15750Hz稍微下降至15734.26Hz。欲知详情,参看Wikipedia:link。

然后,带小数点的帧率如何实现呢,显然每一秒不可能显示相同个数的帧。实际上存在着叫做SMPTE Non-Drop-Frame和SMPTE Drop-Frame的时间同步标准,也就是说在某些时候,会通过丢掉一些帧的方式来将时间同步上。

比如刚才提到的29.97帧率,我们可以计算:29.97 f/sec = 1798.2 f/min = 107892 f/hour;
对于30f/s的帧率我们可以计算: 30 f/s = 1800 f/s = 108000 f/hour;

这样,如果利用每秒30帧的速度来采集视频,而用29.97f/s的速率来播放视频,每个小时就少播放了108帧,这样播放时间会比真实时间变慢。为了解决这个问题,SMPTE 30 Drop-Frame就采取了丢掉这108帧的方式,具体策略是每1分钟丢两帧,如果是第10分钟则不丢,所以每小时丢掉的帧数是:2×60 – 2×6 = 108 帧。更具体的信息,

25 tbr代表帧率;1200k tbn代表文件层(st)的时间精度,即1S=1200k,和duration相关;50 tbc代表视频层(st->codec)的时间精度,即1S=50,和strem->duration和时间戳相关。

ffmpeg中tbr tbc tbn的含义解释相关推荐

  1. ffmpeg 的 tbr tbc 和 tbn的意义

    ffmpeg 的 tbr tbc 和 tbn的意义 2017年03月17日 17:29:43857人阅读 评论(0) 收藏 举报  分类: ffmpeg(45)  音视频编解码技术(26)  点击(此 ...

  2. QT的项目组织结构和pro文件中的各关键字的含义解释

    一.QT项目的组织逻辑 作为C++开发的平台之一,QT具有的诸多特点,这里就不一一赘述.我们着重谈谈QT项目的组织逻辑.用QtCreator创建了一个C++项目后,在项目区视图中,顶级为项目名称,包含 ...

  3. 音视频学习之ffmpeg时间戳相关整理(时间基tbr,tbn,tbc)

    1: I帧/P帧/B帧 I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含⼀幅完整的图像信息,属于帧内编码图像,不含运动⽮量,在解码时不需要参考其他帧图像.因此在I帧 ...

  4. 音视频学习之时间戳相关整理(时间基tbr,tbn,tbc)

    1: I帧/P帧/B帧 I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含⼀幅完整的图像信息,属于帧内编码图像,不含运动⽮量,在解码时不需要参考其他帧图像.因此在I帧 ...

  5. linux中sh+$0,浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释

    摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: ...

  6. 11关于FFmpeg的dump打印出来的tbc,tbn,tbr的解释

    11关于FFmpeg的dump打印出来的tbc,tbn,tbr的解释 1 关于tbn.tbc.tbr三个时基的讲述 1)tbn:容器(container)的时基. 对于输入容器:tbn一般是针对于输入 ...

  7. FFmpeg av_dump_format输出的tbn、tbc、tbr、PAR、DAR的含义

    http://www.jianshu.com/p/5b78a91f1091 利用 ffmpeg 系统函数 dump 码流信息 ffmpeg 提供了一个函数直接帮助你打印出解析到的媒体信息,用法如下: ...

  8. FFmpeg 中的一些参数意义(tbr, tbn, tbc)

    一.系统打印命令解析 在此命令执行过程中,我们可以看到如下数据: 1.ffmpeg在运行过程中需要用到的lib库如下 libavutil      52. 47.101 / 52. 47.101 li ...

  9. ffmpeg设置视频 tbr、tbn、tbc

    时间基相关的定义 tbr 表示帧率,该参数倾向于一个基准,往往tbr跟fps相同.(the time base in AVStream that has come from the container ...

最新文章

  1. 「镁客早报」阿里巴巴与Office Depot合作,服务美国小企业;HTC与印厂商谈品牌许可协议,或退出手机市场...
  2. python朋友圈为什么这么火-火爆朋友圈的Python入门教程,终于有人把它整理成手册了...
  3. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和
  4. html5添加渐变边框效果,《CSS3揭秘》上(边框,投影,渐变,条纹效果,蚂蚁行军)...
  5. struts2 配置
  6. Java Web学习总结(4)——HttpServletResponse对象入门
  7. CCF NOI1089 高精度运算
  8. Exchange 2016 之删除与恢复用户邮箱
  9. 计算机网络医院拓扑图方案设计,[方案]某医院计算机网络综合布线系统设计
  10. Park 变换 系数2/3的由来
  11. 3.实现蛇和基本游戏界面
  12. Word排版之页眉页脚设置
  13. Office-004 Word插入脚注尾注
  14. 硬件工程师入门和进阶
  15. LTspice基础教程-033.绘制电容阻抗特性曲线
  16. 项目经理面试问题整理与技巧分析
  17. PHP + QQ邮箱发送邮箱验证码
  18. oracle游标添加数据,Oracle使用游标更新数据
  19. [论文解读]Bayesian Generalized Kernel Inference for Terrain Traversability Mapping
  20. 启用系统保护是灰色的#win10系统

热门文章

  1. 他们竟用后台数据偷窥喜欢的女性!Facebook一年半解雇52名工程师
  2. 搜狗输入法自定义短语设置
  3. PPT中建立打开Onenote特定笔记本的超链接
  4. 光流传感器 定位精度_光流传感器
  5. Luogu5405 CTS2019氪金手游(容斥原理+树形dp)
  6. java读取文本文件,并且去除重复字段
  7. 雷林鹏最人性化访谈:做投资不仅仅是要赚钱,要成为有价值的人
  8. protoc protoc-gen-go安装
  9. Android第五次课→文件操作
  10. 小米开箱 (原创)