如何在Python中获取视频时长?

75 投票
15 回答
127017 浏览
提问于 2025-04-16 04:53

我需要在Python中获取视频的时长。我想要获取的视频格式包括MP4、Flash视频、AVI和MOV……我使用的是共享主机,所以没有FFmpeg的支持。

你有什么建议吗?

谢谢!

15 个回答

38

在这里有个报道 https://www.reddit.com/r/moviepy/comments/2bsnrq/is_it_possible_to_get_the_length_of_a_video/

你可以使用moviepy这个模块

from moviepy.editor import VideoFileClip
clip = VideoFileClip("my_video.mp4")
print( clip.duration )
78

(2020年的回答)

解决方案:

  1. opencv 0.0065 秒 ✔
  2. ffprobe 0.0998 秒
  3. moviepy 2.8239 秒

OpenCV 方法:

def with_opencv(filename):
    import cv2
    video = cv2.VideoCapture(filename)

    duration = video.get(cv2.CAP_PROP_POS_MSEC)
    frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT)

    return duration, frame_count

用法: print(with_opencv('my_video.webm'))


其他:

ffprobe 方法:

def with_ffprobe(filename):
    import subprocess, json

    result = subprocess.check_output(
            f'ffprobe -v quiet -show_streams -select_streams v:0 -of json "{filename}"',
            shell=True).decode()
    fields = json.loads(result)['streams'][0]

    duration = fields['tags']['DURATION']
    fps      = eval(fields['r_frame_rate'])
    return duration, fps

moviepy 方法:

def with_moviepy(filename):
    from moviepy.editor import VideoFileClip
    clip = VideoFileClip(filename)
    duration       = clip.duration
    fps            = clip.fps
    width, height  = clip.size
    return duration, fps, (width, height)
88

你可以使用一个叫做 ffprobe 的外部命令来实现这个功能。具体来说,你可以从 FFmpeg 的维基页面运行 这个 bash 命令

import subprocess

def get_length(filename):
    result = subprocess.run(["ffprobe", "-v", "error", "-show_entries",
                             "format=duration", "-of",
                             "default=noprint_wrappers=1:nokey=1", filename],
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT)
    return float(result.stdout)

撰写回答