tbr tbn tbc

http://tech.bobgo.net/?m=201004

因为最近的工作需要从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和时间戳相关。

时间: 2024-08-07 14:21:52

tbr tbn tbc的相关文章

ffmpeg 的 tbr tbc 和 tbn的意义

tbn = the time base in AVStream that has come from the container tbc = the time base in AVCodecContext for the codec used for a particular stream tbr = tbr is guessed from the video stream and is the value users want to see when they look for the vid

移动GPU渲染原理的流派——IMR、TBR及TBDR

移动GPU相对桌面级的GPU只能算是未长大的小孩子,虽然小孩子在某些场合也能比成人更有优势(比如杂技.柔术之类的表演),但在力量上还是有先天的差别,主要表现在理论性能和带宽上. 与桌面GPU动辄256bit甚至384bit的位宽.1.2-1.5GHz的高频显存相比,移动GPU不仅要和CPU共享内存带宽,而且普遍使用的是双32bit位宽.LPDDR2-800或1066左右的内存系统,总带宽普遍在10GB/s以内,悲催的Tegra 3使用的还是单通道内存模式,搭配DDR3L的带宽不过6.4GB/s.

如何让手游更省带宽,耗电量更少?TBR渲染架构解析!

如何让手游更省带宽,耗电量更少?渲染或是其中一个可突破的点.本文中,腾讯游戏学院专家Hailong将从为大家解析TBR渲染架构的特点. 什么是TBR? 全称是Tile Based Rendering,主要用在移动设备(手机.平板)上的一种渲染架构,渲染时将屏幕分割成小块,分别渲染.每块大小为16×16 或32×32等(不同产品各不相同),特点是省带宽,耗电小. 与之对应的是IMR(Immediate Mode Rendering),提交的每个渲染要求都会立即开始,这是一种简单而又粗暴的思路,优点

C++的几种强制类型转换

有时我们希望显式地将对象强制类型转换成另外一种类型.例如,如果想在下面的代码中执行浮点数除法: int i, j; double slope = i / j; 就要使用某种方法将i和/或j显式地转换成double,这种方法称作强制类型转换. 命名的强制类型转换 一个命名的强制类型转换具有如下形式: cast_name<type>(expression); 其中,type是转换的目标类型而expression是要转换的值.如果type是引用类型,则结果是左值,cast-name是static_c

西门子PLC学习笔记七-(位逻辑指令)

位逻辑指令处理的对象为二进制位信号.存储在状态字"RLO"中. 1.触点与线圈指令 1)常开触点 在PLC中规定:操作数为1,则常开触点"动作(闭合)":操作数为0,则常开触点"复位(断开)".常开触点使用的操作数是I.Q.M.L.D.T.C 2)常闭触点 在PLC中规定:操作数为1,则常开触点"动作(断开)":操作数为0,则常开触点"复位(闭合)".常开触点使用的操作数是I.Q.M.L.D.T.C 3)输

SUNTANS 对流扩散求解[Tbc]

最近接到一个任务,就是解决FVCOM中对流扩散计算不守衡问题.导师认为是其求解时候水平和垂向计算分开求解所导致的,目前我也没搞清到底有什么问题,反正就是让把SUNTANS的对流扩散计算挪到FVCOM中. SUNTANS模型手册:http://web.stanford.edu/group/suntans/cgi-bin/documentation/user_guide/user_guide.html 介绍文献:<An unstructured-grid, finite-volume, nonhyd

Cococs2d-x c++调用java静态函数

cocos2d-x中JniHelper类封装了我们所需要的,原理是通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用的java类信息,再获取需要调用的java类中的函数信息.再通过JNI环境调用,使用类信息.函数信息,调用对应的java函数. 主要接口: static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName,

365. Water and Jug Problem (GCD or BFS) TBC

https://leetcode.com/problems/water-and-jug-problem/description/ -- 365 There are two methods to solve this problem : GCD(+ elementary number theory) --> how to get GCF, HCD,  BFS Currently, I sove this by first method 1. how to compute GCD recursive

ffmpeg/ffplay 添加实时的时间水印 (转)

右上角添加时间水印 ffmpeg -i 0.ts -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'" 123.ts Input #0, mpegts, from '0.ts': Duration: 00:02:04.86, start: 31303.967878, bitrate: 3814 kb/s Program 1 Stre