Я хочу команду поиска FFmpeg, которая быстрая и точная. Я нашел это .
Решение состоит в том, что мы подаем заявку -ss
как на ввод (быстрый поиск), так и на выход (точный поиск). Но: Если поиск ввода не точен, как мы можем быть уверены, что позиция поиска точна?
Например: если мы хотим найти 00:03:00, команда будет выглядеть примерно так:
ffmpeg -ss 00:02:30 -i <INPUT> ... -ss 00:00:30 <OUTPUT>
Первый -ss
будет стремиться куда-то еще, а не 00:02:30
, скажем 00:02:31
. И после применения второго запроса, конечный результат будет 00:03:01
- не то, что мы хотим. Это верно?
Куда первый -ss
стремится? Ищет ли он ключевой кадр, который ближе всего к 00:02:30
?
Если это так, вот моя мысль - поправьте меня, если я ошибаюсь: после первого поиска мы получаем временную метку результата (в этом примере:) 00:02:31
, затем мы применяем второй поиск с соответствующим временем, в этом случае 00:00:29
.
Вопрос в том, как получить отметку времени первого поиска.
ffprobe
. Если нет, то подойдет любой промежуточный формат, например, ProRes 422, DNxHD, которые не имеют визуальных потерь и только внутрикадровые. Или вы используете что-то вроде HuffYUV и т. Д. Но тогда вы, конечно, снова потеряете «быстрый» аспект.Unrecognized option 'select_streams'
select_streams
опция была добавлена в октябре 2012 года . :) Вы можете обойтись без этого, но тогда вы получите информацию для аудио кадров, смешанных между ними.Я понимаю, что этому вопросу уже несколько лет, но в последней версии ffprobe есть возможность пропустить кадры . Вы можете передать
-skip_frame nokey
информацию только по ключевым кадрам (I-кадрам). Это может сэкономить вам много времени! В MP4-файле размером 2 ГБ 1080p это занимало 4 минуты без пропуска кадров. Добавление параметра пропуска занимает всего 20 секунд.Команда:
ffprobe -select_streams v -skip_frame nokey -show_frames -show_entries frame = pkt_pts_time, pict_type D: \ test.mp4
Результаты:
Таким образом, результаты будут содержать только информацию о ключевых кадрах.
источник
Основываясь на ответе slhck , вот функция bash, которая будет возвращать ближайший ключевой кадр, который происходит ДО
N
секунд.Это также позволяет
-read_intervals
гарантировать, что ffprobe только начнет искать ваш ключевой кадр за 25 секунд доN
секунд. Этот трюк и выход из awk, когда найдена метка времени, значительно ускоряет процесс.пример использования:
Я использую это для обрезки видео файлов без перекодирования. Поскольку вы не можете добавлять новые ключевые кадры без перекодировки, я использую их
ffnearest
для поиска до того, как хочу вырезать. Вот пример:Обратите внимание, что для этого примера вам может потребоваться изменить формат того, что передается в
-ss
параметре, если вы ищете дальше, чем первые 60 секунд.(досадно, что указание ffmpeg стремиться точно к временной метке ключевого кадра заставляет ffmpeg исключать этот ключевой кадр в выходных данных, но вычитая 0,5 секунды из фактической временной метки ключевого кадра, добивается цели. Для bash необходимо использовать
bc
для вычисления выражений с десятичными знаками , но в зш-ss 00:00:$[$(ffnearest input.mkv 28)-0.5]
работает.)источник
если вы хотите получить информацию о I кадрах, вы можете использовать
источник