为视频文件创建的媒体并提取其中每帧的时间戳时出现问题

Issue with media created of a video file and extracting the timestamp of each frame in it

提问人:Jco 提问时间:11/13/2023 最后编辑:Jco 更新时间:11/13/2023 访问量:24

问:

我有两件事要问或确认。

我的目标是根据创建的媒体获取视频中每一帧的确切日期和时间戳,并使用 cv2.putText() 将其显示在输出视频中。

为此,我的计划是获取创建的视频文件媒体的 UNIX 格式时间戳和每帧的位置(以毫秒为单位),将其除以 1000 转换为秒,然后将其添加到媒体创建的 UNIX 格式时间戳中。

基本上对于每一帧,计划是这样的:UNIX 格式的媒体创建值 + cap.get(cv2.CAP_PROP_POS_MSEC)/1000 = 第 n 帧的日期和时间戳

这是对应的代码:

from win32com.propsys import propsys, pscon # excluded from the for loop, only imported once

# Get media created UNIX-formatted timestamp of the input video
properties = propsys.SHGetPropertyStoreFromParsingName(videofilepath.replace('/', '\\'))
dt_property = properties.GetValue(pscon.PKEY_Media_DateEncoded).GetValue()
input_video_creation_timestamp_unix = dt_property.timestamp()

# Calculate the date and timestamp of the frame then display it using cv2.putText(). Please do note that this is applied to each frame of the input video
im0 = cv2.putText(im0, f'{datetime.fromtimestamp(input_video_creation_timestamp_unix + (vid_cap.get(cv2.CAP_PROP_POS_MSEC)/1000))}', (50,150), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)

但是,我在创建的媒体的价值和获取视频中帧的时间戳方面遇到了问题。

1.) 我正在从 TP Link 的 Tapo TC70 获取输入视频。Properties>Details 中显示的创建的媒体与 dt_property 值不一致。例如,参考这张图片image

如您所见,家庭安全摄像头显示的日期和时间戳延迟了大约两 (2) 秒。这正常吗,您知道为什么会发生这种情况的原因以及我可以做的可能修复吗?

2.) 第二个问题如下图image所示:计算 2 分钟视频的最终日期和时间戳时,大约有一秒的差异。您知道我该如何解决这个问题以将确切的日期和时间戳显示为 Tapo TC70 显示的日期和时间戳吗?

如果您需要它们或缺少某些内容,我将提供有关我的问题的更多详细信息。

我希望得到你的答复。谢谢。

python opencv 日期时间 win32com

评论

0赞 Christoph Rackwitz 11/13/2023
错误的库。使用 ffmpeg/PyAV。-- 创建时间在 Linux 系统上并不是真正的事情。在 Windows 上,如果文件是副本,它会“更改”。 -- 是什么让您认为监控摄像头会在第一帧的确切时刻创建文件?-- 你的问题甚至不是关于 OpenCV,而是关于 Win32 文件系统属性或精确行为或监控摄像头,对吧?
0赞 Jco 11/13/2023
嗨,克里斯托夫。感谢您的回复。我使用的是 Properties>Details 中的“Media Created”,而不是 Properties>General 中的“Created”。我也不知道为什么监控摄像头会(为什么)或是否会(或不会)在第一帧的确切时刻创建文件。关于这个问题,我想你是对的,它也主要是关于 win32 文件系统属性的。我可以问一些关于如何使用 ffmpeg/PyAV 来解决我的问题的细节吗?谢谢。
0赞 Christoph Rackwitz 11/13/2023
OpenCV 用于计算机视觉。它具有非常简单的方法来读取视频文件。帧时间戳可能不正确。使用 OpenCV 使用的库:ffmpeg。

答: 暂无答案