ffmpeg中tbc tbr tbn代表的含义

转载 2015年07月09日 23:53:57




ffmpeg中 tbc tbr tbn的含义解释

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

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

Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: mp41
    title      :  Digital Tipping Point
    date           : 2008
    encoder       : Lavf51.10.0
    comment      : license: 
  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 帧。更具体的信息,

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





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

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

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

av_dump_format(fmtCtx, 0, "rtmp://live.hkstv.hk.lxdns.com/live/hks", 0);会打印流媒体的信息,比如: [flv @ 0x7fa6...
  • u013705509
  • u013705509
  • 2016年05月20日 15:56
  • 820

不同媒体容器封装层的timebase分析

在使用ffmpeg封装过程中发现,封装成mp4文件音视频是同步的,但是封装成mpegts文件则有问题,视频播放正常,但音频播放异常,且不同步。所以猜测是封装层的时间基准单位(timebase)在搞鬼。...
  • TopsLuo
  • TopsLuo
  • 2017年09月14日 16:12
  • 141

tbr tbn tbc

不是所有参数都能得到的,有的文件没有这些信息,要看解析层而定。 楼主都有代码了,查查就知道了。      if(st->codec->codec_type == CODEC_TYPE_VIDEO)...
  • weiyuefei
  • weiyuefei
  • 2017年03月17日 17:28
  • 273

ffmpeg中tbr tbc tbn的含义解释

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

tbr tbn tbc 的意思

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

ffmpeg 的 tbr tbc 和 tbn的意义

tbn = the time base in AVStream that has come from the container tbc = the time base in AVCodec...
  • u010477528
  • u010477528
  • 2014年12月25日 16:39
  • 693

用surfaceview播放FFmpeg解码视屏

关于FFmpeg解码请看第一篇教程:FFmpeg解码下载转码库libyuv一般我们用surfaceview播放视频都是才用RGBA格式等播放的,但我们解码之后的视频可能是h.264等等 所以我们这里不...
  • qfanmingyiq
  • qfanmingyiq
  • 2017年06月04日 20:14
  • 1099

JavaWEB 开发中的 / 代表什么

JavaWEB  开发中的 / 有两种代表: 1. 当前WEB 应用的根路径:(/该jsp 需交由Servlet 容器来处理) 有以下几种情况的 / 代表是当前WEB 应用的根路劲。 ①. 请求...
  • wzx735481897
  • wzx735481897
  • 2017年01月19日 00:35
  • 196

normal mapping中TBN矩阵的思考

学习法线贴图(normal mapping)的过程中,最关键的一个矩阵就是TBN矩阵,该矩阵用于将存储在纹理空间中的法向量转换到模型空间中(实际使用相反,为了减少计算量,是将光线从模型空间转换到了纹理...
  • w450468524
  • w450468524
  • 2016年06月12日 23:15
  • 903
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ffmpeg中tbc tbr tbn代表的含义
举报原因:
原因补充:

(最多只允许输入30个字)