ffmpeg 获取每帧的时间
时间: 2023-07-18 17:09:15 浏览: 91
可以通过FFmpeg中AVFrame结构体中的pts(Presentation Time Stamp)和pkt_dts(Decode Time Stamp)获取每帧的时间。
AVFrame结构体中的pts表示该帧在播放时应该显示的时间,pkt_dts表示该帧的解码时间戳。两者的差值即为该帧的显示时间。
可以通过以下代码获取AVFrame中的pts和pkt_dts:
```
AVFrame *frame;
int64_t pts = frame->pts;
int64_t pkt_dts = frame->pkt_dts;
```
其中,pts和pkt_dts的单位为AVStream中的time_base,需要根据time_base进行转换才能得到实际的时间。
相关问题
ffmpeg 获取视频每帧的时间
可以使用FFmpeg命令行工具来获取视频每帧的时间。下面是一个示例命令:
```
ffmpeg -i video.mp4 -vf select='eq(pict_type\,I)' -f null - 2>&1 | grep 'pkt_pts_time' | awk '{print $NF}'
```
该命令使用`select`过滤器获取视频的关键帧,并使用null格式输出到标准输出。然后使用grep命令过滤出包含`pkt_pts_time`的行,并使用awk命令提取出时间戳。
输出的结果是视频每个关键帧的时间戳,可以使用相邻两个关键帧的时间戳之差来计算每帧的时间,例如:
```
ffmpeg -i video.mp4 -vf select='eq(pict_type\,I)' -f null - 2>&1 | grep 'pkt_pts_time' | awk '{print $NF}' > timestamps.txt
awk 'NR>1{print $0-p} {p=$0}' timestamps.txt > frame_times.txt
```
第一条命令将时间戳输出到文件`timestamps.txt`,第二条命令计算相邻两个时间戳之差,并输出到文件`frame_times.txt`。
需要注意的是,该方法只能获取关键帧的时间戳,因此计算得到的每帧时间仅仅是一个近似值。如果需要更精确的每帧时间,可以考虑使用视频帧率(FPS)来计算。
ffmpeg 获取当前帧的时间
您可以使用下面的命令来获取当前帧的时间:
```
ffmpeg -i input.mp4 -vf "select=gte(n\,100)*printf('time=%{pts\\:hms}\n', PTS)" -vframes 1 -f null -
```
这个命令会输出视频文件 `input.mp4` 的第 100 帧的时间。其中:
- `-vf "select=gte(n\,100)*printf('time=%{pts\\:hms}\n', PTS)"` 表示使用 `select` 滤镜选择第 100 帧,并使用 `printf` 函数输出当前帧的时间戳,格式为 `time=时:分:秒.毫秒`。
- `-vframes 1` 表示只输出一帧。
- `-f null` 表示输出到 null 设备,即不输出到文件或屏幕上。
- `-` 表示输出的设备是标准输出,即输出到控制台上。
这个命令会输出类似于 `time=00:00:04.040000` 的时间戳,表示第 100 帧的时间是 4 秒零 40 毫秒。您可以根据需要修改 `-vf` 参数中的帧数 `100` 来输出其他帧的时间戳。