15

Я хочу команду поиска 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

Вопрос в том, как получить отметку времени первого поиска.

2 ответа2

16

Чтобы буквально ответить на вопрос вашего заголовка: Вы можете получить список I-кадров с

ffprobe -select_streams v -show_frames <INPUT> 

Вы можете дополнительно ограничить это необходимым выводом, добавив -show_entries frame=pkt_pts_time,pict_type .

Чтобы увидеть, какой кадр является ближайшим (следует за) определенной временной меткой, вам сначала нужно узнать все временные метки ключевых кадров, например, с помощью awk .

Сначала определите время, которое вы хотите найти, например, 2:30 м, что равно 150 с.

ffprobe -select_streams v -show_frames -show_entries frame=pkt_pts_time,pict_type -v quiet in.mp4 | 
awk -F= ' 
  /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } 
  /pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }  
' | head -n 1

Например, это вернет 150.400000 .


Обратите внимание, что при использовании -ss перед -i , FFmpeg будет находить ключевой кадр, предшествующий точке поиска, а затем присваивать отрицательные значения PTS всем последующим кадрам до тех пор, пока он не достигнет точки поиска. Плеер должен декодировать, но не отображать кадры с отрицательным PTS, и видео должно начинаться точно.

Некоторые игроки не соблюдают это должным образом и отображают черное видео или мусор. В этом случае приведенный выше сценарий можно использовать для поиска PTS ключевого кадра после точки поиска и использовать его для начала поиска с ключевого кадра. Это, однако, не будет точным.

Учтите, что если вы хотите быть очень точным во время поиска и сохранять совместимость со многими игроками, вам, вероятно, следует преобразовать видео в любой формат без потерь, содержащий только интра-формат, который можно вырезать в любой момент, а затем перекодировать. Но это не будет быстрым.

0

если вы хотите получить информацию о I кадрах, вы можете использовать

ffprobe -i input.mp4 -v quiet -select_streams v -show_entries frame=pkt_pts_time,pict_type|grep -B 1 'pict_type=I'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .