相关文章推荐
刚毅的眼镜  ·  在PHP的Guzzle客户端中设置可选的头部·  1 年前    · 
魁梧的灭火器  ·  Outlook将邮件内容中的数据以表格形式发 ...·  1 年前    · 
爱热闹的海豚  ·  vue项目使用vue2-org-tree ...·  2 年前    · 
细心的乒乓球  ·  Lua 随机数生成问题 - ...·  2 年前    · 
Code  ›  获取视频中每帧的时间戳开发者社区
https://cloud.tencent.com/developer/ask/sof/114752287
大气的小笼包
1 年前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

问 获取视频中每帧的时间戳

Stack Overflow用户
提问于 2017-12-10 20:42:49
EN

我用我编写的Android5.2应用程序从平板电脑的前摄像头录制了几段视频。我已经为每个视频存储了以毫秒为单位的开始时间戳(Unix时间)。

不幸的是,每个视频都有不同的帧(范围从20到30)。有了OpenCV,我就可以获得每个视频的框架:

代码语言: javascript
复制
import cv2
video = cv2.VideoCapture(videoFile)
fps = video.get(cv2.CAP_PROP_FPS)

这很好,理论上我可以为视频中的每一帧添加1000/fps (由于毫秒)。但这假设框架在整个录音过程中保持稳定。我不知道是不是这样。

Python中是否有可能获得视频中独立于框架的每一帧的时间戳(毫秒)?

5 63.6K 0 票数 35
EN
python
opencv
video
frame-rate

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-12-10 21:06:45

你想要 cv2.CAP_PROP_POS_MSEC 。查看所有不同的捕获属性 这里 。

编辑:实际上,正如 丹马šek 向我指出的那样,当您获取该属性时,它看起来像是OpenCV是 精确地做这个计算 (至少假设您使用的是FFMPEG):

代码语言: javascript
复制
case CV_FFMPEG_CAP_PROP_POS_MSEC:
    return 1000.0*(double)frame_number/get_fps();

所以看起来你总是依赖于一个恒定的帧速率假设。然而,即使假设帧速率不变,重要的是要乘以帧数,而不只是继续添加 1000/fps 。当您反复添加浮点数时,错误会增加,在长视频中,这会产生很大的差异。例如:

代码语言: javascript
复制
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秒的视频。无论如何,使用这个属性就更容易了。

票数 49
EN

Stack Overflow用户

发布于 2021-10-08 07:39:08

这是一个简化的版本,只需在视频中读取并打印出带有时间戳的帧号。

代码语言: javascript
复制
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()

这提供了如下所示的输出:

代码语言: javascript
复制
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
...
票数 10
EN

Stack Overflow用户

发布于 2021-09-25 08:57:57

我要用电影来获得几秒钟的个人帧 的时间

代码语言: javascript
复制
pip install moviepy
代码语言: javascript
复制
import sys
import numpy as np
import cv2
import moviepy.editor as mpy
from matplotlib import pyplot as plt
 
推荐文章
刚毅的眼镜  ·  在PHP的Guzzle客户端中设置可选的头部
1 年前
魁梧的灭火器  ·  Outlook将邮件内容中的数据以表格形式发送_outlook发送复杂表格-CSDN博客
1 年前
爱热闹的海豚  ·  vue项目使用vue2-org-tree (避免踩坑)_路人甲小码的博客-CSDN博客
2 年前
细心的乒乓球  ·  Lua 随机数生成问题 - echo111333 - 博客园
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号