2014-11-17 3 views
3

Чтобы получить длительность и разрешение видео, я получил эту функцию:Как получить продолжительность онлайн-видео, не загружая полное видео?

def getvideosize(url, verbose=False): 
try: 
    if url.startswith('http:') or url.startswith('https:'): 
     ffprobe_command = ['ffprobe', '-icy', '0', '-loglevel', 'repeat+warning' if verbose else 'repeat+error', '-print_format', 'json', '-select_streams', 'v', '-show_streams', '-timeout', '60000000', '-user-agent', BILIGRAB_UA, url] 
    else: 
     ffprobe_command = ['ffprobe', '-loglevel', 'repeat+warning' if verbose else 'repeat+error', '-print_format', 'json', '-select_streams', 'v', '-show_streams', url] 
    logcommand(ffprobe_command) 
    ffprobe_process = subprocess.Popen(ffprobe_command, stdout=subprocess.PIPE) 
    try: 
     ffprobe_output = json.loads(ffprobe_process.communicate()[0].decode('utf-8', 'replace')) 
    except KeyboardInterrupt: 
     logging.warning('Cancelling getting video size, press Ctrl-C again to terminate.') 
     ffprobe_process.terminate() 
     return 0, 0 
    width, height, widthxheight, duration = 0, 0, 0, 0 
    for stream in dict.get(ffprobe_output, 'streams') or []: 
     if dict.get(stream, 'duration') > duration: 
      duration = dict.get(stream, 'duration') 
     if dict.get(stream, 'width')*dict.get(stream, 'height') > widthxheight: 
      width, height = dict.get(stream, 'width'), dict.get(stream, 'height') 
    if duration == 0: 
     duration = 1800 
    return [[int(width), int(height)], int(float(duration))+1] 
except Exception as e: 
    logorraise(e) 
    return [[0, 0], 0] 

Но некоторые интернеты-видео идет без duration тега. Можем ли мы что-то сделать, чтобы получить его продолжительность?

+0

В целом невозможно. Во многих случаях информация о длительности недоступна (требуется фактический синтаксический анализ) или находится в конце файла. – 9dan

ответ

2

Если у вас есть прямая ссылка на самом видео, как http://www.dl.com/xxx.mp4, вы можете направить использованию ffprobe, чтобы продолжительность этого видео с помощью:

ffprobe -i some_video_direct_link -show_entries format=duration -v quiet -of csv="p=0" 
0

Я знаю, этот вопрос старый, но есть лучше способ сделать это.

Объединив ответ einverne с некоторым реальным Python (в данном случае Python 3.5), мы можем создать короткую функцию, которая возвращает количество секунд (длительность) в видео.

import subprocess 

def get_duration(file): 
    """Get the duration of a video using ffprobe.""" 
    cmd = 'ffprobe -i {} -show_entries format=duration -v quiet -of csv="p=0"'.format(file) 
    output = subprocess.check_output(
     cmd, 
     shell=True, 
     stderr=subprocess.STDOUT 
    ) 
    output = float(output) 
    return round(output) 

И называть эту функцию:

video_length_in_seconds = get_duration('/path/to/your/file') # mp4, avi, etc 

Это даст вам общее количество секунд, округляется до ближайшей целой секунды. Поэтому, если ваше видео составляет 30,6 секунды, это вернет 31.

Команда FFMpeg ffprobe -i video_file_here -show_entries format=duration -v quiet -of csv="p=0" получит вашу продолжительность видео для вас и не должна загружать все видео.

Смежные вопросы