FFmpeg中的时间基(time_base), AV_TIME_BASE
一. AV_TIME_BASE
经常在FFmpeg的代码中看到一个奇怪的单位 AV_TIME_BASE ,比如 AVFormatContext 结构体中就有这样一个字段: duration ,它在FFmpeg中的解释如下:
/**
* Duration of the stream, in AV_TIME_BASE fractional
* seconds. Only set this value if you know none of the individual stream
* durations and also do not set any of them. This is deduced from the
* AVStream values if not set.
*
* Demuxing only, set by libavformat.
*/
int64_t duration;
以一段时长为60s的视频为例,用FFmpeg将其读入到内存,并打印出它的 duration 后发现:
AVFormatContext *ic = NULL;
int re = avformat_open_input(&ic, path, , );
if (re != ) {
LOGE("avformat_open_input failed: %s", av_err2str(re));
return;
}
LOGI("avformat_open_input %s success", path);
re = avformat_find_stream_info(ic, );
if (re != ) {
LOGE("avformat_find_stream_info failed: %s", av_err2str(re));
}
LOGI("duration is: %lld, nb_streams = %d, input filename is: %s, bitrate = %lld", ic->duration, ic->nb_streams, ic->filename, ic->bit_rate);

duration 此时为60000000,而它的注释也说得很清楚,是以 AV_TIME_BASE 为单位,找到 AV_TIME_BASE :
/**
* Internal time base represented as integer
*/ #define AV_TIME_BASE 1000000 /**
* Internal time base represented as fractional value
*/ #define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
发现该值为1000000,60000000/1000000刚好为60,而1s = 1000000μs 由此可见,FFmpeg内部的时间单位其实是微秒(μs),而 AV_TIME_BASE_Q 其实是一种分数的表示形式,其中的1表示分子, AV_TIME_BASE 也就是1000000,表示的是分母,所以它其实就是1微秒,也就是 / 秒。
事实上,除了 AVFormatContext 中的 duration ,FFmpeg中的pts,dts也是基于timebase来换算的,时间基(time_base)是FFmpeg中作为时间单位的概念,比如上面的 AV_TIME_BASE_Q ,它就相当于是 / 秒,也就是把1s分成1000000份,可以理解成是一把尺,那么每一格就是 / 秒,此时的time_base就是{1, 1000000}。所谓的时间基就是指每个刻度是多少秒。那么它的作用是什么呢?其实就是为了更精确的度量时间。
二. pts/dts的时间戳究竟代表什么
之前解释过PTS和DTS的基本概念:
DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
光看字面意思,它也是一种时间戳,那它这种时间戳到底是什么样子的?是传统意义上 yyyy-MM-dd HH:mm:ss ?首先可以肯定的是绝不是 yyyy-MM-dd HH:mm:ss,因为这种时间戳的控制精度不够,上面甚至都用μs来表示了,那这个PTS和DTS的值到底是个什么东西?
pts和dts的值指的是占多少个时间刻度(占多少个格子)。它的单位不是秒,而是时间刻度。只有pts与time_base两者结合在一起,才能表达出具体的时间是多少。好比我只告诉你,某个物体的长度占某一把尺上的20个刻度。但是我不告诉你,每个刻度是多少厘米,你仍然无法知道物体的长度。pts 就是这样的东西,pts(占了多少个时间刻度) , time_base(每个时间刻度是多少秒) ,而帧的显示时间戳 = pts(占了多少个时间刻度) * time_base(每个时间刻度是多少秒)。
三. 一些时间基转换的场景
【计算视频总时长】
AVFormatContext *ifmt_ctx = NULL;
avformat_open_input(&ifmt_ctx, filename, NULL, NULL);
double totle_seconds = ifmt_ctx->duration * av_q2d(AV_TIME_BASE_Q);
【根据PTS求出一帧在视频中对应的秒数位置】
double sec = enc_pkt.pts * av_q2d(ofmt_ctx->streams[stream_index]->time_base);
【ffmpeg内部的时间戳与标准的时间转换方法】
timestamp(ffmpeg内部时间戳) = AV_TIME_BASE * time(秒)
time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部时间戳)
【当需要把视频Seek到N秒的时候】
// 指定流索引
int pos = * r2d(ic->streams[videoStream]->time_base);
av_seek_frame(ic,videoStream, pos, AVSEEK_FLAG_BACKWARD|AVSEEK_FLAG_FRAME );
// 未指定指定流索引
int64_t timestamp = N * AV_TIME_BASE;
av_seek_frame(fmtctx, -, timestamp, AVSEEK_FLAG_BACKWARD);
参考链接:
FFmpeg中的时间基(time_base), AV_TIME_BASE的更多相关文章
- FFMPEG 中dts和pts区别
FFMPEG 中dts和pts区别 CopyFrom:http://www.cnblogs.com/yinxiangpei/articles/3892982.html 视频的显示和存放原理 对 ...
- 理解ffmpeg中的pts,dts,time_base
首先介绍下概念: PTS:Presentation Time Stamp.PTS主要用于度量解码后的视频帧什么时候被显示出来 DTS:Decode Time Stamp.DTS主要是标识读入内存中的b ...
- 零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构
http://www.cnblogs.com/tanlon/p/3879081.html 在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构: (1) AVF ...
- FFMPEG中关于ts流的时长估计的实现(转)
最近在做H.265 编码,原本只是做编码器的实现,但客户项目涉及到ts的封装,搞得我不得不配合了解点ts方面的东西.下面技术文档不错,转一下. ts流中的时间估计 我们知道ts流中是没有时间信息的,我 ...
- [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构
在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构: (1) AVFormatContext AVFormatContext是一个贯穿始终的数据结构,很多函 ...
- FFMPEG中关于ts流的时长估计的实现
ts流中的时间估计 我们知道ts流中是没有时间信息的,我门来看看ffmpeg是怎么估计其duration的 方法1.通过pts来估计 static void estimate_timings_from ...
- ffmpeg中的sws_scale算法性能测试
经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理.以前一直很懒,懒得测试和甄 别应该使用哪种算法,最近的工作时间,很多时候需要等待别人.忙 ...
- iOS平台在ffmpeg中使用librtmp
转载请注明出处:http://www.cnblogs.com/fpzeng/p/3202344.html 系统版本:OS X 10.8 一.在iOS平台上交叉编译librtmp librtmp lin ...
- 【转】ffmpeg中的sws_scale算法性能测试
经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理.以前一直很懒,懒得测试和甄别应该使用哪种算法,最近的工作时间,很多时候需要等待别人.忙里 ...
随机推荐
- 说说nginx,iis,apache,tomcat
一.nginx ngnix是反向代理服务器,它是代理,本身并不执行,是个传话筒,把用户提交的请求转发给web服务器,再把web服务器的结果转发给用户.为了提高性能,启用反向代理,实际的web服务器可以 ...
- OSPF补全计划-2
想起来几个面试题: 1. OSPF在什么情况下会stuck in Exstart /Exchange状态? 我知道的一个答案是两个端口的mtu不一致.当然整个也不是绝对,因为可以用ip ospf mt ...
- [HDU1693]Eat the Trees
Description: 给出n*m的方格,有些格子不能铺线,其它格子必须铺,可以形成多个闭合回路.问有多少种铺法? Hint: \(n,m<=12\) Solution: 与原来单回路那题转移 ...
- CY7C68013 USB接口相机开发记录 - 第三天:固件修改
上篇说了驱动怎么配置,这篇记录下对应的设备固件怎么配置.首先看下我们工程结构: 摘自官方文档AN61345 STARTUP.A51是建立工程时自动生成的文件,下面所有文件都是手动添加的.对于下面的几个 ...
- 2017.08.05【NOIP提高组】模拟赛B组
Summary 这次比赛打得非常差,第一题我以为是个难题,于是推了一下就没再去想了,然而考场上一堆人AC.第二题状态设错了,导致结果有后效性.结束后pascal卡常卡了36次.第三题别人n²就过了,我 ...
- Flask jinja2
{{ }} #引用 执行 非逻辑代码 {% %} #逻辑代码 引用变量 @app.template_global() # 全局函数 Markup # 安全标签字符串儿 {% macro func() ...
- http理解
http是一种基与客户端和服务端的架构模式,通过一种可靠的连接(URL)来交换消息,是一个诶状态的请求/响应协议. http协议传输过程 client发送request到server,server接收 ...
- pycharm实现sublime的显示效果,很惊艳哦
收到https://github.com/simoncos/pycharm-monokai链接中的指引 下载箭头所指的文件,然后按照 PyCharm -> File -> Settings ...
- 【暴力枚举&BFS】Flow Free @RMRC2017/upcexam5124
时间限制: 1 Sec 内存限制: 128 MB 题目描述 Flow Free is a puzzle that is played on a 2D grid of cells, with some ...
- openstack 之~keystone之网关协议
第一:静态页面和动态页面 上一篇博客介绍了HTTP后,我们知道一个web server的本质就是 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP ...