DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

ffmpeg中的时间单位

 1. AV_TIME_BASE

 ffmpeg中的内部计时单位(时钟基),ffmepg中的所有时间表示的单位,

 比如AVStream中的duration, 即表示这个流的长度为duration个AV_TIME_BASE。AV_TIME_BASE定义为:

 #define
  AV_TIME_BASE 1000000

  

 2. 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对象指针。

 


 3. 时钟基转换公式
timestamp(ffmpeg内部时间戳) = AV_TIME_BASE * time(秒)
time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部时间戳)

 


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

 int64_t timestamp = N * AV_TIME_BASE; 
 
 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,来把时间戳从一个时基调整到另外一个时基。

 在进行时基转换的时候,我们应该首选这个函数,因为它可以避免溢出的情况发生。

posted on   DoubleLi  阅读(474)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2018-02-28 EMIPLIB简介
2016-02-28 C语言字符串操作总结大全(超详细)
2015-02-28 找出程序cpu使用率高的原因
2014-02-28 CImageList使用简要说明
2014-02-28 VC,一条会被鼠标移动的直线
2014-02-28 对话框1
2014-02-28 多种方法读写文件
点击右上角即可分享
微信分享提示