Как узнать продолжительность видео на Python? - PullRequest
26 голосов
/ 02 октября 2010

Мне нужно получить продолжительность видео в Python. Мне нужно получить следующие форматы видео: MP4 , Flash-видео, AVI и MOV ... У меня есть решение для общего хостинга, поэтому у меня нет FFmpeg поддержка.

Ответы [ 8 ]

39 голосов
/ 02 октября 2010

Возможно, вам потребуется вызвать внешнюю программу.ffprobe может предоставить вам эту информацию:

import subprocess

def getLength(filename):
  result = subprocess.Popen(["ffprobe", filename],
    stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
  return [x for x in result.stdout.readlines() if "Duration" in x]
16 голосов
/ 20 апреля 2016

Чтобы сделать все немного проще, следующие коды устанавливают вывод в JSON .

Вы можете использовать его с помощью probe(filename) или получить длительность с помощью duration(filename):

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

Работает на 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
14 голосов
/ 26 июня 2016

Как сообщается здесь 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 )
5 голосов
/ 27 апреля 2018
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)
5 голосов
/ 23 декабря 2016

Найдите эту новую библиотеку Python: https://github.com/sbraz/pymediainfo

Чтобы получить длительность:

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

Приведенный выше код проверен на наличие действительного файла mp4 и работает, но вы должны выполнить больше проверок, поскольку он сильно зависит от вывода MediaInfo.

0 голосов
/ 12 января 2019

Функция, которую я придумал.Это в основном использует только 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 ) )

Продолжительность выходов, как это:

7.338000
0 голосов
/ 13 июля 2018

для тех, кому нравится использовать программу 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
0 голосов
/ 31 октября 2017

Откройте терминал cmd и установите пакет python: mutagen с помощью этой команды

python -m pip install mutagen

затем используйте этот код, чтобы получить длительность видео и его размер:

import os
from mutagen.mp4 import MP4

audio = MP4("filePath")

print(audio.info.length)
print(os.path.getsize("filePath"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...