低调的枇杷 · 金钱不是万能的!踢不过替补阵容,切尔西6亿镑 ...· 11 月前 · |
追风的打火机 · 第30话-太阳与月下钢刀-漫画牛· 1 年前 · |
成熟的小刀 · 福田智蓝唐山发布多款新品 ...· 1 年前 · |
深情的单杠 · 潘神的迷宫4k UHD ...· 1 年前 · |
道上混的创口贴 · 北汽新能源2020销量25914辆 ...· 1 年前 · |
我用我编写的Android5.2应用程序从平板电脑的前摄像头录制了几段视频。我已经为每个视频存储了以毫秒为单位的开始时间戳(Unix时间)。
不幸的是,每个视频都有不同的帧(范围从20到30)。有了OpenCV,我就可以获得每个视频的框架:
import cv2
video = cv2.VideoCapture(videoFile)
fps = video.get(cv2.CAP_PROP_FPS)
这很好,理论上我可以为视频中的每一帧添加1000/fps (由于毫秒)。但这假设框架在整个录音过程中保持稳定。我不知道是不是这样。
Python中是否有可能获得视频中独立于框架的每一帧的时间戳(毫秒)?
发布于 2017-12-10 21:06:45
你想要
cv2.CAP_PROP_POS_MSEC
。查看所有不同的捕获属性
这里
。
编辑:实际上,正如 丹马šek 向我指出的那样,当您获取该属性时,它看起来像是OpenCV是 精确地做这个计算 (至少假设您使用的是FFMPEG):
case CV_FFMPEG_CAP_PROP_POS_MSEC:
return 1000.0*(double)frame_number/get_fps();
所以看起来你总是依赖于一个恒定的帧速率假设。然而,即使假设帧速率不变,重要的是要乘以帧数,而不只是继续添加
1000/fps
。当您反复添加浮点数时,错误会增加,在长视频中,这会产生很大的差异。例如:
import cv2
cap = cv2.VideoCapture('vancouver2.mp4')
fps = cap.get(cv2.CAP_PROP_FPS)
timestamps = [cap.get(cv2.CAP_PROP_POS_MSEC)]
calc_timestamps = [0.0]
while(cap.isOpened()):
frame_exists, curr_frame = cap.read()
if frame_exists:
timestamps.append(cap.get(cv2.CAP_PROP_POS_MSEC))
calc_timestamps.append(calc_timestamps[-1] + 1000/fps)
else:
break
cap.release()
for i, (ts, cts) in enumerate(zip(timestamps, calc_timestamps)):
print('Frame %d difference:'%i, abs(ts - cts))
帧0差: 0.0 框架1差异: 0.0 框架2差异: 0.0 帧3差: 1.4210854715202004e-14 帧4差: 0.011111111111091532 帧5差: 0.011111111111091532 帧6差: 0.011111111111091532 帧7差: 0.011111111111119953 框架8差: 0.022222222222183063 帧9差: 0.022222222222183063 帧294差: 0.8111111111411446
这当然是以毫秒为单位的,所以可能看起来没那么大。但在这里,我的计算距离接近1ms,这只是一个11秒的视频。无论如何,使用这个属性就更容易了。
发布于 2021-10-08 07:39:08
这是一个简化的版本,只需在视频中读取并打印出带有时间戳的帧号。
import cv2
cap = cv2.VideoCapture('path_to_video/video_filename.avi')
frame_no = 0
while(cap.isOpened()):
frame_exists, curr_frame = cap.read()
if frame_exists:
print("for frame : " + str(frame_no) + " timestamp is: ", str(cap.get(cv2.CAP_PROP_POS_MSEC)))
else:
break
frame_no += 1
cap.release()
这提供了如下所示的输出:
for frame : 0 timestamp is: 0.0
for frame : 1 timestamp is: 40.0
for frame : 2 timestamp is: 80.0
for frame : 3 timestamp is: 120.0
for frame : 4 timestamp is: 160.0
for frame : 5 timestamp is: 200.0
for frame : 6 timestamp is: 240.0
for frame : 7 timestamp is: 280.0
for frame : 8 timestamp is: 320.0
for frame : 9 timestamp is: 360.0
for frame : 10 timestamp is: 400.0
for frame : 11 timestamp is: 440.0
for frame : 12 timestamp is: 480.0
...
发布于 2021-09-25 08:57:57
我要用电影来获得几秒钟的个人帧 的时间
pip install moviepy
import sys
import numpy as np
import cv2
import moviepy.editor as mpy
from matplotlib import pyplot as plt
追风的打火机 · 第30话-太阳与月下钢刀-漫画牛 1 年前 |