如何在 Python 中获取视频的持续时间?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3844430/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 12:59:51  来源:igfitidea点击:

How to get the duration of a video in Python?

pythonvideo

提问by eos87

I need to get the video duration in Python. The video formats that I need to get are MP4, Flash video, AVI, and MOV... I have a shared hosting solution, so I have no FFmpegsupport.

我需要在 Python 中获取视频时长。我需要获取的视频格式是MP4、Flash 视频、AVI和 MOV...我有一个共享托管解决方案,所以我没有FFmpeg支持。

采纳答案by SingleNegationElimination

You can use the external command ffprobefor this. Specifically, run this bash commandfrom the FFmpeg Wiki:

您可以ffprobe为此使用外部命令。具体来说,从 FFmpeg Wiki运行这个 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)

回答by Andrew_1510

To make things a little bit easier, the following codes put the output to JSON.

为了让事情更容易一些,以下代码将输出放入JSON

You can use it by using probe(filename), or get duration by using duration(filename):

您可以通过 using 来使用它probe(filename),或者通过使用来获取持续时间duration(filename)

json_info     = probe(filename)
secondes_dot_ = duration(filename) # float number of seconds

It works on Ubuntu 14.04where of course ffprobeinstalled. The code is not optimized for speed or beautiful purposes but it works on my machine hope it helps.

它适用于Ubuntu 14.04当然ffprobe安装的位置。该代码并未针对速度或美观目的进行优化,但它可以在我的机器上运行,希望对您有所帮助。

#
# Command line use of 'ffprobe':
#
# ffprobe -loglevel quiet -print_format json \
#         -show_format    -show_streams \
#         video-file-name.mp4
#
# man ffprobe # for more information about ffprobe
#

import subprocess32 as sp
import json


def probe(vid_file_path):
    ''' Give a json from ffprobe command line

    @vid_file_path : The absolute (full) path of the video file, string.
    '''
    if type(vid_file_path) != str:
        raise Exception('Gvie ffprobe a full file path of the video')
        return

    command = ["ffprobe",
            "-loglevel",  "quiet",
            "-print_format", "json",
             "-show_format",
             "-show_streams",
             vid_file_path
             ]

    pipe = sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT)
    out, err = pipe.communicate()
    return json.loads(out)


def duration(vid_file_path):
    ''' Video's duration in seconds, return a float number
    '''
    _json = probe(vid_file_path)

    if 'format' in _json:
        if 'duration' in _json['format']:
            return float(_json['format']['duration'])

    if 'streams' in _json:
        # commonly stream 0 is the video
        for s in _json['streams']:
            if 'duration' in s:
                return float(s['duration'])

    # if everything didn't happen,
    # we got here because no single 'return' in the above happen.
    raise Exception('I found no duration')
    #return None


if __name__ == "__main__":
    video_file_path = "/tmp/tt1.mp4"
    duration(video_file_path) # 10.008

回答by mobcdi

As reported here https://www.reddit.com/r/moviepy/comments/2bsnrq/is_it_possible_to_get_the_length_of_a_video/

如此处报道https://www.reddit.com/r/moviepy/comments/2bsnrq/is_it_possible_to_get_the_length_of_a_video/

you could use the moviepy module

你可以使用moviepy模块

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

回答by chenyi1976

Find this new python library: https://github.com/sbraz/pymediainfo

找到这个新的 Python 库:https: //github.com/sbraz/pymediainfo

To get the duration:

获取持续时间:

from pymediainfo import MediaInfo
media_info = MediaInfo.parse('my_video_file.mov')
#duration in milliseconds
duration_in_ms = media_info.tracks[0].duration

Above code is tested against a valid mp4 file and works, but you should do more checks because it is heavily relying on the output of MediaInfo.

上面的代码针对有效的 mp4 文件进行了测试并且可以正常工作,但是您应该进行更多检查,因为它严重依赖 MediaInfo 的输出。

回答by Omar Ali

Open cmd terminal and install python package:mutagenusing this command

打开cmd终端并安装python包:mutagen使用这个命令

python -m pip install mutagen

python -m pip install mutagen

then use this code to get the video duration and its size:

然后使用此代码获取视频持续时间及其大小:

import os
from mutagen.mp4 import MP4

audio = MP4("filePath")

print(audio.info.length)
print(os.path.getsize("filePath"))

回答by DeWil

from subprocess import check_output

file_name = "movie.mp4"

#For Windows
a = str(check_output('ffprobe -i  "'+file_name+'" 2>&1 |findstr "Duration"',shell=True)) 

#For Linux
#a = str(check_output('ffprobe -i  "'+file_name+'" 2>&1 |grep "Duration"',shell=True)) 

a = a.split(",")[0].split("Duration:")[1].strip()

h, m, s = a.split(':')
duration = int(h) * 3600 + int(m) * 60 + float(s)

print(duration)

回答by vossman77

for anyone that like using the mediainfoprogram:

对于喜欢使用mediainfo程序的任何人:

import json
import subprocess

#===============================
def getMediaInfo(mediafile):
    cmd = "mediainfo --Output=JSON %s"%(mediafile)
    proc = subprocess.Popen(cmd, shell=True,
        stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    stdout, stderr = proc.communicate()
    data = json.loads(stdout)
    return data

#===============================
def getDuration(mediafile):
    data = getMediaInfo(mediafile)
    duration = float(data['media']['track'][0]['Duration'])
    return duration

回答by sr9yar

A function I came up with. This is basically using only ffprobearguments

我想出来的一个函数。这基本上使用参数ffprobe

from subprocess import  check_output, CalledProcessError, STDOUT 


def getDuration(filename):

    command = [
        'ffprobe', 
        '-v', 
        'error', 
        '-show_entries', 
        'format=duration', 
        '-of', 
        'default=noprint_wrappers=1:nokey=1', 
        filename
      ]

    try:
        output = check_output( command, stderr=STDOUT ).decode()
    except CalledProcessError as e:
        output = e.output.decode()

    return output


fn = '/app/648c89e8-d31f-4164-a1af-034g0191348b.mp4'
print( getDuration(  fn ) )

Outputs duration like this:

输出持续时间如下:

7.338000

回答by hydra3333

The above pymediainfo answer really helped me. Thank you.

上面的 pymediainfo 答案确实对我有帮助。谢谢你。

As a beginner, it did take a while to find out what was missing (sudo apt install mediainfo) and how to also address attributes in other ways (see below).

作为初学者,确实需要一段时间才能找出缺少的内容(sudo apt install mediainfo)以及如何以其他方式处理属性(见下文)。

Hence this additional example:

因此这个额外的例子:

# sudo apt install mediainfo
# pip3 install pymediainfo
from pymediainfo import MediaInfo
media_info = MediaInfo.parse('/home/pi/Desktop/a.mp4')
for track in media_info.tracks:
    #for k in track.to_data().keys():
    #    print("{}.{}={}".format(track.track_type,k,track.to_data()[k]))
    if track.track_type == 'Video':
        print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
        print("{} width                 {}".format(track.track_type,track.to_data()["width"]))
        print("{} height                {}".format(track.track_type,track.to_data()["height"]))
        print("{} duration              {}s".format(track.track_type,track.to_data()["duration"]/1000.0))
        print("{} duration              {}".format(track.track_type,track.to_data()["other_duration"][3][0:8]))
        print("{} other_format          {}".format(track.track_type,track.to_data()["other_format"][0]))
        print("{} codec_id              {}".format(track.track_type,track.to_data()["codec_id"]))
        print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
    elif track.track_type == 'Audio':
        print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
        print("{} format                {}".format(track.track_type,track.to_data()["format"]))
        print("{} codec_id              {}".format(track.track_type,track.to_data()["codec_id"]))
        print("{} channel_s             {}".format(track.track_type,track.to_data()["channel_s"]))
        print("{} other_channel_s       {}".format(track.track_type,track.to_data()["other_channel_s"][0]))
        print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("********************************************************************")
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Video width                 1920
Video height                1080
Video duration              383.84s
Video duration              00:06:23
Video other_format          AVC
Video codec_id              avc1
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Audio format                AAC
Audio codec_id              mp4a-40-2
Audio channel_s             2
Audio other_channel_s       2 channels
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

回答by Mina Abd El-Massih

As reported here https://www.reddit.com/r/moviepy/comments/2bsnrq/is_it_possible_to_get_the_length_of_a_video/

you could use the moviepy module

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

如此处报道 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 )

If you're trying to get the duration of many videos in a folder it'll crash giving the error: AttributeError: 'AudioFileClip' object has no attribute 'reader'

如果您尝试获取文件夹中许多视频的持续时间,它会崩溃并给出错误:AttributeError: 'AudioFileClip' object has no attribute 'reader'

So, in order to avoid that you'll need to add

因此,为了避免这种情况,您需要添加

clip.close()

Based on this: https://zulko.github.io/moviepy/_modules/moviepy/video/io/VideoFileClip.html

基于此:https: //zulko.github.io/moviepy/_modules/moviepy/video/io/VideoFileClip.html

So the code would look like this:

所以代码看起来像这样:

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

Cheers! :)

干杯! :)