Мне нужно получить продолжительность видео в Python. Видеоформаты, которые мне нужно получить, MP4, Flash-видео, AVI и MOV... У меня есть общедоступное решение для хостинга, поэтому у меня нет поддержки FFmpeg.
Как получить продолжительность видео в Python?
Ответ 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
Ответ 3
Как сообщается здесь 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 )
Ответ 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