使用OpenCV Python获取视频时长
OpenCV是一个开源的Python计算机视觉库。它提供了许多函数来执行各种图像和视频处理操作。该库使用Numpy模块将所有视频帧和图像表示为ndarray类型。我们需要安装numpy库,并确保在我们的Python解释器中也安装了numpy模块。
在本文中,我们将看到使用Python OpenCV模块获取视频时长的不同方法。
OpenCV提供了 VideoCapture.get() 方法来通过传递属性标识符之一来获取视频的指定属性。以下是get()方法的语法:
VideoCapture.get(propId)
其中 propId 是属性标识符。以下是一些属性标识符的列表:
- CAP_PROP_FRAME_COUNT :此标志提供视频文件中帧的数量。
- CAP_PROP_FPS :这将提供帧率。(FPS表示每秒帧数)
- CAP_PROP_POS_MSEC :视频文件的当前位置,以毫秒或视频捕获时间戳表示。
- CAP_PROP_FRAME_WIDTH :这将提供视频流中帧的宽度。
- CAP_PROP_FRAME_HEIGHT :这将提供视频流中帧的高度。
在这里,我们将使用 CAP_PROP_FRAME_COUNT 和 CAP_PROP_FPS 标志来获取视频的时长。
方法
- 使用cv2.VideoCapture()加载视频。
-
使用cv2.CAP_PROP_FPS属性获取每秒帧数。
-
使用cv2.CAP_PROP_FRAME_COUNT属性获取帧的总数。
-
通过将(总帧数)除以(每秒帧数)来计算以秒为单位的持续时间。
-
将总持续时间转换为所需的格式。
下面的长度为01:05的输入视频将用于使用OpenCV python获取不同格式的持续时间。
示例
在此示例中,我们将仅获取以秒为单位的视频持续时间。
import cv2
# create video capture object
cap = cv2.VideoCapture('Videos/One min video.mov')
# count the number of frames
fps = cap.get(cv2.CAP_PROP_FPS)
totalNoFrames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
durationInSeconds = totalNoFrames // fps
print("Video Duration In Seconds:", durationInSeconds, "s")
输出
Video Duration In Seconds: 65.0 s
示例
在这个示例中,我们将找到视频的时长,以分钟和秒为单位。
import cv2
def get_dur(filename):
video = cv2.VideoCapture(filename)
fps = video.get(cv2.CAP_PROP_FPS)
frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT)
seconds = frame_count / fps
minutes = int(seconds / 60)
rem_sec = int(seconds % 60)
return f"{minutes}:{rem_sec}"
print('Video Duration In Seconds:',get_dur("Videos/One min video.mov"))
输出
Video Duration In Seconds: 1:5
示例
不需要手动将时长从秒转换为分钟,我们可以使用datetime模块来计算视频的时长。
import datetime
def get_dur(filename):
video = cv2.VideoCapture(filename)
fps = video.get(cv2.CAP_PROP_FPS)
frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT)
seconds = frame_count // fps
video_time = datetime.timedelta(seconds=seconds)
return video_time
print('Video Duration In Seconds:',get_dur("Videos/One min video.mov"))
输出
Video Duration In Seconds: 0:01:05
最初,我们通过总帧数减去每秒帧数(fps)来计算视频时长(以秒为单位)。然后,通过使用timedelta()方法,将视频时长从秒转换为时:分:秒的形式。