ffmpeg中的时间 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q等介绍 

原文:http://www.cnblogs.com/yinxiangpei/articles/3892982.html   作者:裴银祥

I,P,B帧和PTS,DTS的关系

目录 [hide]

  • 1 视频的显示和存放原理

    • 1.1 DTS和PTS
  • 2 ffmpeg中的时间单位
    • 2.1 AV_TIME_BASE
    • 2.2 AV_TIME_BASE_Q
    • 2.3 时间基转换公式

视频的显示和存放原理

对于一个电影,帧是这样来显示的:I B B P。现在我们需要在显示B帧之前知道P帧中的信息。因此,帧可能会按照这样的方式来存储:IPBB。这就是为什么我们会有一个解码时间戳和一个显示时间戳的原因。解码时间戳告诉我们什么时候需要解码,显示时间戳告诉我们什么时候需要显示。所以,在这种情况下,我们的流可以是这样的:

PTS: 1 4 2 3
DTS: 1 2 3 4
Stream: I P B B

通常PTS和DTS只有在流中有B帧的时候会不同。

DTS和PTS

音频和视频流都有一些关于以多快速度和什么时间来播放它们的信息在里面。音频流有采样,视频流有每秒的帧率。然而,如果我们只是简单的通过数帧和乘以帧率的方式来同步视频,那么就很有可能会失去同步。于是作为一种补充,在流中的包有种叫做DTS(解码时间戳)和PTS(显示时间戳)的机制。为了这两个参数,你需要了解电影存放的方式。像MPEG等格式,使用被叫做B帧(B表示双向bidrectional)的方式。另外两种帧被叫做I帧和P帧(I表示关键帧,P表示预测帧)。I帧包含了某个特定的完整图像。P帧依赖于前面的I帧和P帧并且使用比较或者差分的方式来编码。B帧与P帧有点类似,但是它是依赖于前面和后面的帧的信息的。这也就解释了为什么我们可能在调用avcodec_decode_video以后会得不到一帧图像。

ffmpeg中的时间单位

AV_TIME_BASE

ffmpeg中的内部计时单位(时间基),ffmepg中的所有时间都是于它为一个单位,比如AVStream中的duration即以为着这个流的长度为duration个AV_TIME_BASE。AV_TIME_BASE定义为:

#define         AV_TIME_BASE   1000000

AV_TIME_BASE_Q

ffmpeg内部时间基的分数表示,实际上它是AV_TIME_BASE的倒数。从它的定义能很清楚的看到这点:

#define         AV_TIME_BASE_Q   (AVRational){1, AV_TIME_BASE}

AVRatioal的定义如下:

typedef struct AVRational{
int num; //numerator
int den; //denominator
} AVRational;

ffmpeg提供了一个把AVRatioal结构转换成double的函数:

static inline double av_q2d(AVRational a){
/**
* Convert rational to double.
* @param a rational to convert
**/return a.num / (double) a.den;
}

现在可以根据pts来计算一桢在整个视频中的时间位置:

timestamp(秒) = pts * av_q2d(st->time_base)
 

计算视频长度的方法:

time(秒) = st->duration * av_q2d(st->time_base)
 

这里的st是一个AVStream对象指针。

时间基转换公式

  • timestamp(ffmpeg内部时间戳) = AV_TIME_BASE * time(秒)
  • time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部时间戳)

所以当需要把视频跳转到N秒的时候可以使用下面的方法:

int64_t timestamp = N * AV_TIME_BASE;
2
av_seek_frame(fmtctx, index_of_video, timestamp, AVSEEK_FLAG_BACKWARD);

ffmpeg同样为我们提供了不同时间基之间的转换函数:

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)

这个函数的作用是计算a * bq / cq,来把时间戳从一个时基调整到另外一个时基。在进行时基转换的时候,我们应该首选这个函数,因为它可以避免溢出的情况发生。

ffmpeg中的时间 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q 介绍相关推荐

  1. FFmpeg中的时间基(time_base), AV_TIME_BASE

    FFmpeg中的时间基(time_base), AV_TIME_BASE 一. AV_TIME_BASE 经常在FFmpeg的代码中看到一个奇怪的单位 AV_TIME_BASE ,比如 AVForma ...

  2. FFmpeg中AVDictionary介绍

    FFmpeg中的AVDictionary是一个结构体,简单的key/value存储,经常使用AVDictionary设置或读取内部参数,声明如下,具体实现在libavutil模块中的dict.c/h, ...

  3. C语言程序设计 C语言中的时间函数

    C语言中关于时间的函数 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时.时间的获取.时间的计算和显示格式等方面进行了阐述.本文还通过大量的实例向你展示了t ...

  4. 理解ffmpeg中的pts,dts,time_base

    首先介绍下概念: PTS:Presentation Time Stamp.PTS主要用于度量解码后的视频帧什么时候被显示出来 DTS:Decode Time Stamp.DTS主要是标识读入内存中的b ...

  5. 关于FFMPEG 中I帧、B帧、P帧、PTS、DTS

    1 基本概念 1.1 名词解释 媒体:是表示,传输,存储信息的载体,常人们见到的文字.声音.图像.图形等都是表示信息的媒体. 多媒体: 是声音.动画.文字.图像和录像等各种媒体的组合,以图文并茂,生动 ...

  6. ts流中的时间概念: pcr,pts,dts 实例解说

    ts流中的时间概念: pcr,pts,dts 实例解说 ---------------------------------------- PCR OPCR ---------------------- ...

  7. ffmpeg中av_read_frame 超时设置

    https://trac.ffmpeg.org/ ffmpeg wiki ffmpeg中avformat_open_input超时设置 这里有日志可以参考:日志 y也可以参考: https://blo ...

  8. ffmpeg源码简析(十二)FFMPEG中的主要结构体总结

    FFMPEG中结构体很多.最关键的结构体可以分成以下几类: a) 解协议(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存储视音频使用 ...

  9. MPEG2-TS音视频同步原理(PCR dts pts)

    一.引言 MPEG2系统用于视音频同步以及系统时钟恢复的时间标签分别在ES,PES和TS这3个层次中.   在TS 层, TS头信息包含了节目时钟参考PCR(Program Clock Referen ...

最新文章

  1. python怎么识别拼音-python获取一组汉字拼音首字母的方法
  2. 20151024学习内容:安全相关
  3. Python语言学习之pandas:DataFrame二维表的简介、常用函数、常用案例之详细攻略
  4. linux加载虚拟sriov网卡,如何配置BroadCOM网卡的SR-IOV功能
  5. 关于spring mybateis 定义resultType=java.util.HashMap
  6. C++Adaline自适应线性神经网络算法(附完整源码)
  7. C#获取文件夹下的所有文件的文件名
  8. javabeans_(单元测试)JavaBeans的技巧
  9. java编程 队列_5.1、顺序队列(java实现)
  10. Java多线程归纳总结
  11. 安卓移动办公软件_小企业使用的移动办公软件
  12. ajax实例详解(2)
  13. win10升级工具_win10升级安装工具
  14. Flutter开发App简介
  15. ProE5.0有限元分析优化设计Mechanica视频教程
  16. 一台电脑有几个计算机用户账户,多人共用一台电脑设置多个使用账户的方法
  17. 神经网络未来发展趋势,神经网络未来发展前景
  18. 景区电商平台网站建设方案
  19. IP地址、子网掩码与划分方法
  20. vue导入excel进度条_vue中使用excel导入导出

热门文章

  1. Poly-encoders: architectures and pre-trainingstrategies for fast and accurate multi-sentence scorin
  2. 扎心!原来在月薪3000和30000的差距竟是这样
  3. 2020Cfa最新mock下载和使用
  4. 经常听别人说安全测试很重要,然鹅你并不了解?一文带你了解全貌
  5. 学生管理系统(完整版)
  6. ​吃了假辣椒酱的企鹅,你遇到过哪些被骗的经历?
  7. 碰壁会反弹的小球的实现
  8. 5G NR学习笔记:帧结构和物理资源
  9. Python 条件语句if的语法、注意事项、代码示例
  10. 计算机中丟失Slc.dll,调试符号不会加载slc.dll和sppc.dll