ffmpeg 获取视频每帧的时间
时间: 2023-10-19 20:13:20 浏览: 44
可以使用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)来计算。
相关问题
python ffmpeg 获取视频每帧的时间
可以使用Python的FFmpeg库(pyffmpeg)来获取视频每帧的时间。下面是一个示例代码:
```python
import ffmpeg
# 打开视频文件
video = ffmpeg.input('video.mp4')
# 构建视频流过滤器
filter = 'select=\'eq(pict_type\\,I)\''
# 获取视频每个关键帧的时间戳
out, _ = (
video
.output('null', format='null', vframes='100', filter=filter)
.run(capture_stdout=True)
)
timestamps = [float(line) for line in out.decode().split('\n') if line]
# 计算每帧的时间
times = [timestamps[i+1]-timestamps[i] for i in range(len(timestamps)-1)]
```
代码中使用`ffmpeg.input()`打开视频文件,并使用`select`过滤器获取视频的关键帧。然后使用`output()`方法输出到null格式(因为不需要实际输出),并指定获取前100帧。最后通过计算关键帧之间的时间差,得到每帧的时间。
需要注意的是,该方法只能获取关键帧的时间戳,因此计算得到的每帧时间仅仅是一个近似值。如果需要更精确的每帧时间,可以考虑使用视频帧率(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` 来输出其他帧的时间戳。