因为最近的工作需要从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个时间单元中有一帧。

3. 时间同步方式:
问题来了: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 帧。更具体的信息,可以参考:link1, link2。

唉,多么麻烦,如果采集播放都采用30f/s不就省事儿多了,可是技术的事情总是面临着向前兼容的问题,就像铁路与马屁股的故事一样!

http://topic.csdn.net/u/20091225/09/0a7499ce-7015-40fb-9c9d-f8628d0fe275.html

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

不是所有参数都能得到的,有的文件没有这些信息,要看解析层而定。这是代码中的内容:
     if(st->codec->codec_type == CODEC_TYPE_VIDEO){
         if(st->r_frame_rate.den && st->r_frame_rate.num)
             print_fps(av_q2d(st->r_frame_rate), "tbr");
         if(st->time_base.den && st->time_base.num)
             print_fps(1/av_q2d(st->time_base), "tbn");
         if(st->codec->time_base.den && st->codec->time_base.num)
             print_fps(1/av_q2d(st->codec->time_base), "tbc");
     }

tbr tbn tbc 的意思相关推荐

  1. tbr tbn tbc

    tbr tbn tbc http://tech.bobgo.net/?m=201004 因为最近的工作需要从MP4视频中提取一些关键帧,要了解如何将视频的时间点转换为对应的帧号,所以查阅了一些关于视频 ...

  2. 【FFmpeg】tbr tbn tbc

    tbr tbn tbc LAS本地转码不指定,则从视频文件拷贝参数 这是快手的: 看起来也是一样的: Duration: N/A, start: 1612149.198000, bitrate: 22 ...

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

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

  4. ffmpeg中tbr tbc tbn的含义解释

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

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

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

  6. ffmpeg相关资源

    FFPLAY的原理(一) http://blog.csdn.net/shenbin1430/article/details/4291893 ubuntu12.04下命令安装ffplay等: sudo ...

  7. ffmpeg (四):ffmpeg, ffplay, ffprobe用法

    转自:http://blog.csdn.net/oldmtn/article/details/20830301 1. 使用ffmepg 将input.avi专码成output.ts,并设置视频的码率为 ...

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

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

  9. ajax文件插件上传,7 款基于 JavaScript/AJAX 的文件上传插件

    本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 具有多文件上传.拖 ...

最新文章

  1. Java基础—序列化底层原理
  2. python3装饰器例子_Python装饰器几个有用又好玩的例子
  3. Spring 中注入什么意思?
  4. 谈谈 js判断数组 那点事
  5. C语言小案例_关于爱普生喷墨机APG复位错误(APG reset error)的最终答案: 故障案例 每日一例 【第1358篇】...
  6. html期末作业代码网页设计 我的家乡网站设计——我的家乡-四川成都(4页) HTML+CSS+JavaScript
  7. 老毛桃 固态硬盘 系统迁移
  8. debian8文件服务器,debian 8 下部署开发环境
  9. 微博个人资料信息抓取
  10. Windows 切换node版本开发Vue3和Vue2
  11. 舍弗勒、斯凯孚、阿尔斯通、默沙东、联合利华、洲际、希尔顿、盖璞等外企在中国 | 美通社头条...
  12. uCOS-II之邮箱
  13. Vitas - star 歌词,拼音版
  14. (私人收藏)植物大战僵尸游戏角色素材集成包(用于练习)
  15. 执行shell脚本进入到指定目录
  16. Unity HybridCLR热更新技术实现
  17. nodejs 如何检测端口可用性
  18. java-net-php-python-jspm作业管理系统计算机毕业设计程序
  19. C\S结构的插件式开发思想以及向B\S结构的架构延伸(二)
  20. kinect在linux上驱动下载,Ubuntu安装Kinect驱动(openni、NITE、Sensor)及遇到的问题

热门文章

  1. 总有人会偷看你的朋友圈
  2. 学习心得flatten函数
  3. 计算机共享网络热点,(传输)将win7计算机无线网络变成WiFi热点,使​​手机和笔记本电脑可以共享Internet...
  4. 新版标准日本语初级_第四课
  5. 看看京东应急供应链是怎样构建的?
  6. Element文件上传-解决跨域
  7. python创建角色_Python Design Pattern - 4.创建型模式
  8. 直连式SAS/SATA存储+超高清视频
  9. 用计算机怎么算二进制数,计算机上的二进制是怎么算的?(计算机中使用二进制来处理和储存所有的数据“逢二进一”。它使用0和1来表示所有的数。例如:1...
  10. Linux下MongoDB的入门安装、配置与启动