it-swarm.com.de

Wie bekomme ich die Dauer eines Videos in Python?

Ich brauche die Videodauer in Python. Die Videoformate, die ich bekommen muss, sind MP4 , Flash-Video, AVI und MOV ... Ich habe eine Shared Hosting-Lösung, daher habe ich keine FFmpeg Unterstützung.

26
eos87

Sie müssen wahrscheinlich ein externes Programm aufrufen. ffprobe kann Ihnen diese Informationen geben:

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]

Um es etwas einfacher zu machen, setzen die folgenden Codes die Ausgabe aufJSON.

Sie können es verwenden, indem Sie probe(filename) verwenden, oder die Dauer abrufen, indem Sie duration(filename) verwenden:

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

Es funktioniert auf Ubuntu 14.04 wo natürlich ffprobe installiert ist. Der Code ist nicht für Geschwindigkeit oder schöne Zwecke optimiert, aber er funktioniert auf meiner Maschine und ich hoffe, er hilft.

#
# 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 __== "__main__":
    video_file_path = "/tmp/tt1.mp4"
    duration(video_file_path) # 10.008
16
Andrew_1510

Wie hier berichtet https://www.reddit.com/r/moviepy/comments/2bsnrq/is_it_possible_to_get_the_length_of_a_video/

sie könnten das moviepy-Modul verwenden 

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

Finden Sie diese neue Python-Bibliothek: https://github.com/sbraz/pymediainfo

Um die Dauer zu erhalten:

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

Der obige Code wurde mit einer gültigen mp4-Datei getestet und funktioniert, aber Sie sollten mehr Prüfungen durchführen, da er stark auf die Ausgabe von MediaInfo angewiesen ist.

5
chenyi1976
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)
4
DeWil

Eine Funktion, die ich mir ausgedacht habe. Dies verwendet grundsätzlich nur ffprobe-Argumente

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 ) )

Ausgabedauer wie folgt:

7.338000
1
sr9yar

für alle, die das Programm mediainfo verwenden möchten:

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
vossman77

Öffnen Sie das Cmd-Terminal und installieren Sie das Python-Paket: mutagen mit diesem Befehl 

python -m pip install mutagen

verwenden Sie dann diesen Code, um die Videodauer und ihre Größe zu ermitteln:

import os
from mutagen.mp4 import MP4

audio = MP4("filePath")

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