Точность временных меток с помощью ffmpeg на основе частоты кадров?

Вот моя текущая команда, основанная на этом ответе:

ffmpeg \
-hide_banner \
-r $FRAMERATE \
-s $(((WIDTH + 63) / 64 * 64))"x"$(((HEIGHT + 15) / 16 * 16)) \
-f rawvideo \
-pix_fmt yuv420p \
-i - \
-filter_complex "crop=$WIDTH:$CROPPED_HEIGHT:0:0,settb=1/1000,setpts=RTCTIME/1000-1500000000000,split[out][ts];[out]setpts=N/FRAME_RATE/TB[out]" \
-map [out] \
-c:v ffv1 \
-vsync passthrough \
-f matroska \
"$OUTPUT_PATH/${FILENAME}.mkv" \
-map [ts] \
-flush_packets 1 \
-f mkvtimestamp_v2 \
"$OUTPUT_PATH/${FILENAME}_ts2.txt"

$FRAMERATE установлен на 4. Вот результат _ts2.txt:

# timecode format v2
181489707750
181489708750
181489708751
181489709000
181489709250
181489709251
181489709500
181489709501
181489709750
181489710000
181489710001
181489710250
181489710500
181489710750
181489711000
181489711250
...

Как видите, за исключением икоты в начале (не знаю почему), он генерирует только временные метки, кратные 250 мс, то есть 1/$FRAMERATE. Как я могу сделать эти временные метки более точными, в идеале на уровне миллисекунд?

Я голосую за то, чтобы закрыть этот вопрос, потому что, как поясняется тегом ffmpeg: в тему входят только вопросы о программном использовании библиотек, API или инструментов FFmpeg. Вопросы об интерактивном использовании инструмента командной строки следует задавать на superuser.com или video.stackexchange.com.

Rob 15.04.2023 14:02

@Doopy Есть 1000 миллисекунд в секунду, поэтому установка FPS 4 означает 1000_ms / 4_frames == 250_ms_per_frame. Для большей точности решите, сколько кадров вы хотите в секунду, а затем рассчитайте 1000 / FPS. Отрегулируйте FPS, чтобы настроить точность. PS: Просто совет... Возможно, вы не заметили, но вы не определили свой параметр "Сделайте эти метки времени более точными". Есть ли число, которое вы хотите достичь в секунду? Потому что говоря «В идеале на уровне миллисекунд?» не даст вам ответа. Это слишком загадочно.

VC.One 15.04.2023 17:50

@VC.One В этом случае мой конвейер может обрабатывать не более 8 кадров в секунду. Однако кадры, конечно, не всегда берутся точно в 0,000, 0,250 и т. д., поэтому вместо этого я хочу, например. .035, .285 и т.д. Так что максимальная погрешность +-1 мс, если так понятнее

Doopy 16.04.2023 20:35

@Rob Эта команда взята из сценария bash, обратите внимание на переменные оболочки. Запись должна быть полностью автоматизирована. Это считается?

Doopy 16.04.2023 20:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TL;DR: удалите /1000-1500000000000, если возможно.

Я удалил -1500000000000 и сравнил метки времени при использовании /1000 и без него. Я заметил, что в обоих случаях числа всегда заканчиваются на 000, 250, ... как указано выше. Это один вывод с необработанным RTCTIME в виде точек:

# timecode format v2
1681736801215250
1681736802129750
1681736802258750
1681736802392250
1681736802545500
1681736802683750
1681736802815250
1681736802965000
1681736803101000
...
1681736809206250
1681736809450500
1681736809707000
1681736809950500
1681736810207500
1681736810448500
1681736810705500
1681736810950750
1681736811205000
1681736811451250

Эти значения указаны с точностью до микросекунд. Обратите внимание, что в первом блоке разница между 1-м и 2-м кадром составляет ~900 мс, а в остальных — ~150 мс. Во втором блоке (конец файла) разница составляет ~250 мс, как и ожидалось для частоты кадров. Я не уверен, в чем причина различий в начале, возможно, это связано с буферизацией входного потока или необходимостью ffmpeg «догонять» после инициализации.

Также обратите внимание, что «икота» исчезла. Раньше с /1000 я получал такое предупреждение:

[mkvtimestamp_v2 @ 0x55c03b1eb0] Non-monotonous DTS in output stream 1:0; previous: 1681737336750, current: 1681737336750; changing to 1681737336751. This may result in incorrect timestamps in the output file.

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

В целом необработанные метки времени RTCTIME кажутся правдоподобными и подразумевают, что деление на 1000 по какой-то причине не работает должным образом. В моем случае я могу просто удалить его, потому что генерация временной метки, похоже, не ограничена точностью / длиной временной метки (как указано в справочном ответе) в моей версии ffmpeg, а мои инструменты обработки написаны самостоятельно и не имеют никаких проблем. Ваши результаты могут отличаться от стандартных инструментов, таких как mkvtoolnix, но я не пробовал.

Другие вопросы по теме