Подтвердить что ты не робот

Как получить продолжительность видео в Python?

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

4b9b3361

Ответ 1

Вам, вероятно, потребуется вызвать внешнюю программу. 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]

Ответ 2

Чтобы сделать вещи немного проще, следующие коды помещают вывод в 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 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

Ответ 4

Найдите новую библиотеку 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.

Ответ 5

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)

Ответ 6

Откройте терминал 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"))

Ответ 7

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

Ответ 8

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