ffmpeg中的时间单位

192 篇文章 ¥19.90 ¥99.00
ffmpeg使用AV_TIME_BASE作为内部时间单位,所有时间值都基于此。AV_TIME_BASE_Q是其分数表示,方便转换。通过AV_TIME_BASE_Q * timestamp可将ffmpeg时间戳转换为秒。ffmpeg提供函数处理不同时间基间的转换,避免溢出。了解这些转换对于精确控制视频播放至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,来把时间戳从一个时基调整到另外一个时基。在进行时基转换的时候,我们应该首选这个函数,因为它可以避免溢出的情况发生。



http://blog.youkuaiyun.com/chinabinlang/article/details/49885765

在使用 FFmpeg 时,可以通过 `drawtext` 滤镜将视频的时间码信息叠加到视频画面上。时间码通常表示为 `HH:MM:SS:FF`(小时:分钟:秒:帧数)格式,FFmpeg 提供了内置变量来获取当前帧的时间戳信息,并结合字体文件和样式设置来实现时间码的显示效果。 以下是一个基本的 FFmpeg 命令示例,用于在视频上叠加当前时间码: ```bash ffmpeg -i input.mp4 -vf "drawtext=fontfile=arial.ttf:text='%{pts_time}':fontcolor=white:fontsize=24:x=10:y=10" -c:a copy output.mp4 ``` - `fontfile=arial.ttf`:指定字体文件路径,确保系统中存在该字体文件。 - `text='%{pts_time}'`:使用 FFmpeg 内置变量 `pts_time` 表示当前帧的时间戳(以秒为单位)[^3]。 - `fontcolor=white`:设置字体颜色为白色。 - `fontsize=24`:设置字体大小为 24。 - `x=10:y=10`:设置时间码在视频画面中的位置(左上角偏移量)。 如果需要更精确的时间码格式(例如 `HH:MM:SS:FF`),可以结合 `setpts` 和自定义脚本进行处理,或者使用 `expr` 表达式来格式化时间戳。例如,以下命令将时间戳格式化为 `HH:MM:SS` 格式: ```bash ffmpeg -i input.mp4 -vf "drawtext=fontfile=arial.ttf:time='%{localtime}':fontcolor=white:fontsize=24:x=10:y=10" -c:a copy output.mp4 ``` - `text='%{localtime}'`:使用系统本地时间作为时间码信息[^3]。 此外,如果希望在播放过程中实时显示时间码(例如在播放器中),可以通过 FFmpeg 的 API 接口(如 `libavfilter` 和 `libavformat`)在解码和渲染阶段动态添加时间码信息。这种实现方式通常需要多线程处理,以避免阻塞主界面[^2]。 ### 显示时间码的注意事项 - **字体文件**:必须确保字体文件路径正确,并且字体文件格式为 `.ttf` 或 `.otf`。 - **性能影响**:叠加时间码会增加一定的 CPU/GPU 负载,尤其是在高分辨率或高帧率的视频中。 - **时间戳精度**:使用 `pts_time` 可以获得帧级时间戳,但需要结合帧率进行换算以获得更直观的时间码格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值