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和时间戳相关。
tbr tbn tbc的更多相关文章
- 【转】用ffmpeg转多音轨的mkv文件
命令: ffmpeg -i AmericanCaptain.mkv -map 0:v -vcodec copy -map 0:a:1 -acodec copyAmericanCaptain.mp4 - ...
- FFmpeg编解码处理1-转码全流程简介
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584901.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...
- FFmpeg时间戳详解
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584910.html 1. I帧/P帧/B帧 I帧:I帧(Intra-coded pi ...
- ffmpeg相关资源
FFPLAY的原理(一) http://blog.csdn.net/shenbin1430/article/details/4291893 ubuntu12.04下命令安装ffplay等: sudo ...
- ffmpeg基本功能使用
任务描述:由给定图像序列合成 24fps 视频 方案一 直接对图像进行操作,适用于图像名比较规范且默认即为所需顺序 ffmpeg -f image2 -i ./images_crop_%d.png - ...
- 多媒体文件格式(二):FLV 格式
在网络的直播与点播场景中,FLV也是一种常见的格式,FLV是Adobe发布的一种可以作为直播也可以作为点播的封装格式,其封装格式非常简单,均以FLVTAG的形式存在,并且每一个TAG都是独立存在的,接 ...
- FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...
- 开源流媒体服务器SRS学习笔记(1) - 安装、推流、拉流
SRS(Simple RTMP Server) 是国人写的一款非常优秀的开源流媒体服务器软件,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群. 一.安装 官网提供了3种安 ...
- Darwin Streaming Server服务器mp4文件点播返回”415 Unsupported Media Type“错误
Darwin Streaming Server中mp4文件点播失败,通过抓包发现服务器返回”415 Unsupported Media Type“错误,如下: RTSP/ Unsupported Me ...
随机推荐
- JobControl管理多job依赖完整示例
处理 复杂的要求的时候,有时一个mapreduce程序是完成不了的,往往需要多个mapreduce程序,这个时候就要牵扯到各个任务之间的依赖关系,所谓 依赖就是一个MR Job 的处理结果是另外的MR ...
- linux时间自动同步
1,修正本地时区及ntp服务 #yum -y install ntp#rm -rf /etc/localtime#ln -s /usr/share/zoneinfo/Asia/Shanghai /et ...
- apache ambari web页面无法访问解决办法
ambari-server启动成功,但是页面无法访问 作者:Bo liang链接:http://www.zhihu.com/question/34405898/answer/115001510来源:知 ...
- Fluent Validation For .NET
//.net 中数据验证,一个开源的项目,直接下载 1 using FluentValidation; public class CustomerValidator: AbstractValidato ...
- 使用for xml path 分组查询
SELECT OLevel, WorkOrgID, WorkOrgName, PlanNum, PlanFinishNum, PlanUnFinishNum, PlanCanceledNum, P ...
- ios Swift 动手写
Swift语言概览 基本概念 注:这一节的代码源自The Swift Programming Language中的A Swift Tour. Hello, world 类似于脚本语言,下面的代码即是一 ...
- IOS 高级开发 KVC(二)
前一篇博客最后介绍了KVC 再json 转模型时遇到一些问题.今天接着来介绍KVC 的其他用法.其实我们在一开始的时候就一直再强调命名的重要性.命名规范是KVC 存活的基础.如果没有这个条件支撑,那么 ...
- QtSQL学习笔记(1)- 概述
Qt SQL是Qt提供的核心模块,用以支持SQL数据库.Qt SQL的API被分为不同的层: ■ 驱动层 (Driver layer) ■ API层 (SQL API layer) ■ 用户接口层 ( ...
- ASP.NET MVC Web API使用示例
上篇博客讲解rest服务开发时,曾经提到过asp.net mvc中的rest api,由于篇幅原因,没有在上篇博客中进行讲解,这里专门拿出来进行讨论.还是一样引用上次的案例,用asp.net mvc提 ...
- 建站服务器的最优选择之Windows Or Linux
转载于:http://www.0553114.com/news/detail-702287.html 不管是个人建站,还是中小型企业建站,选择一款合适的主机是站长朋友们共同的心愿.主机是选择Windo ...