Почему опция -to иногда ведет себя по-другому?

283
Houseman

Два разных видео доставляют мне неприятности, когда я придумываю код для их обрезки в определенный момент времени, потому что один и тот же код не обрезает видео одинаковым образом при обработке одной и той же ffmpegкомандой

В первом видео, если я укажу -to10, оно будет вырезано на один кадр раньше.

Со вторым видео, если я укажу -to10, оно будет вырезано в этом кадре.

Прочитав комментарий здесь, один человек говорит «познакомится не всегда выполняются на DTS, это на самом деле зависит от контейнера Если контейнер временных меток являются очками, искание в PTS, если контейнер метка время является д.т.н., искание в формате DTS.»

Что я могу сделать, чтобы определить, как мои разрезы будут работать заранее?

В идеале я хотел бы иметь возможность найти информацию в выводе ffprobeкоманды, а затем соответствующим образом настроить свою логику

видео 1

ffprobe -hide_banner steamedHams.mp4 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'steamedHams.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2018-02-17T02:19:35.000000Z Duration: 00:02:43.10, start: 0.000000, bitrate: 190 kb/s Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 116 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 72 kb/s (default) Metadata: creation_time : 2018-02-17T02:19:35.000000Z handler_name : IsoMedia File Produced by Google, 5-11-2011 

видео 2

ffprobe -hide_banner trailer.mp4 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'trailer.mp4': Metadata: major_brand : mp42 minor_version : 512 compatible_brands: isomiso2avc1mp41 creation_time : 2018-03-14T22:10:26.000000Z encoder : HandBrake 1.0.7 2017040900 Duration: 00:00:33.02, start: 0.000000, bitrate: 2778 kb/s Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/bt709), 1920x1080 [SAR 1:1 DAR 16:9], 2653 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc (default) Metadata: creation_time : 2018-03-14T22:10:26.000000Z handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 159 kb/s (default) Metadata: creation_time : 2018-03-14T22:10:26.000000Z handler_name : Stereo 
0

1 ответ на вопрос

1
slhck

Конечно, вы можете использовать ffprobe для проверки кадров и пакетов:

ffprobe -select_streams v -show_packets \ -show_entries packet=pts_time,dts_time -of compact=p=0 input.mp4 

Это покажет PTS и DTS каждого пакета.

Следующий пост может помочь вам определить ближайший ключевой кадр до заданной отметки времени.

Я знаю, как `-ss` работает с ключевыми кадрами, но моя проблема с командой` -to`. Как знание PTS и DTS каждого пакета поможет мне определить, как будет вести себя команда `to`? Houseman 6 лет назад 0
Потому что опция `-to` будет аналогично искать метку времени каждого кадра при принятии решения о том, когда прекратить кодирование. Вам нужно взглянуть на два примера и понять, почему выбрана временная метка PTS или DTS. slhck 6 лет назад 0
Извините, если мне неясно, но я пытался спросить: что определяет, выбран ли PTS или DTS? Что я должен искать? Houseman 6 лет назад 0
Ах, ваш первоначальный вопрос был о том, как проверить видео. Я думал, что вы могли бы найти какой-то образец там. Я полагаю, что это будет зависеть от демультиплексора пакетов с десятками (если не больше) возможностей того, как этот демультиплексор выберет метку времени кадра. Я не тот человек, чтобы спрашивать, хотя; разработчик FFmpeg, который знает внутренности, может знать больше. slhck 6 лет назад 0

Похожие вопросы