Как декодировать временные метки PTS и извлекать видеокадры

Я хочу извлечь видеокадры и получить временную метку PTS для каждого из них. У меня есть входной файл MPEG-2 TS, и я предпочитаю использовать какой-нибудь инструмент с открытым исходным кодом, например ffmpeg или что-то подобное. Проблема в том, что когда я использую -vf showinfoопцию, она показывает мне измененный PTS. Это команда, которую я использую:

ffmpeg -hide_banner -i input.ts -vf showinfo -vsync 0 -start_number 0 fr%05d.jpg &> log.txt

Итак, здесь мой результат похож на:

[Parsed_showinfo_0 @ 0x5629810a2000] n: 435 pts:1593000 pts_time:17.7    pos: 55729780 fmt:yuv420p sar:1/1 s:1920x1080 i:T iskey:0 type:B checksum:27AB3255 plane_checksum:[B27F2CE8 F1689963 59E56BFB] mean:[142 127 129] stdev:[36.5 2.8 4.1]
[Parsed_showinfo_0 @ 0x5629810a2000] n: 436 pts:1596600 pts_time:17.74   pos: 55690112 fmt:yuv420p sar:1/1 s:1920x1080 i:T iskey:0 type:B checksum:94AD9CBE plane_checksum:[FB0C9721 C477122C 2AA6F362] mean:[142 127 129] stdev:[36.5 2.8 4.1]

Когда я выполняю команду ffprobe:

$ ffprobe -i input.ts -show_frames -select_streams v:0 -print_format flat | grep pkt_pts=

frames.frame.435.pkt_pts=4205067450
frames.frame.436.pkt_pts=4205071050

И мне нужно узнать временную метку pkt_pts в извлеченных файлах, возможно, только с одной командой. Вдобавок я проверял SCTE-35 и там у меня было смещение в 150 кадров между интервалами вставки. Например, в соответствии с PKT_PTS начальный и конечный кадры — 1650 и 2550, которые передаются через SCTE-35, но фактические кадры — 1500 2400, если смотреть только на извлеченные кадры.

Ответы (1)

FFmpeg по умолчанию удалит начальное смещение. Чтобы сохранить его, добавьте -copyts.

Описание -vsync 0не точное и было написано 8+ лет назад: Каждый кадр передается со своей меткой времени от демультиплексора к мультиплексору. . Синхронизация видео вступает в силу только после того, как кадр вышел из конвейера декодера (+filtergraph). Но вы должны сохранить его, чтобы избежать потери/дублирования кадров.

да, это прекрасно работает, спасибо за подсказку! Я просто не понял, должен ли я использовать -vsync 0или нет в моей командной строке.