ffmpeg - временной код и частичная частота кадров (дублирование кадров)
Я записываю две разные частоты кадров, используя ffmpeg, 60 и 100. Или, по крайней мере, я думал, что записываю 60 и 100, теперь кажется, что на самом деле это 59,94 и 99,98.
Вот команда, которую я использовал:
ffmpeg -y -thread_queue_size 9999 -guess_layout_max 0 -f dshow -video_size 1920x1080 -rtbufsize 2147.48M -framerate 60 ^
-pixel_format yuyv422 -i video="Game Capture HD60 S (Video) (#01)":audio="ADAT (5+6) (RME Fireface UC)" -map 0:0,0:1 ^
-map 0:1 -c:v h264_nvenc -preset: llhp -pix_fmt yuv420p -b:v 40M -minrate 40M -maxrate 40M -bufsize 40M -b:a 384k -ac 2 ^
-r 60 -af "pan=mono|c0=c0, adelay=84" -vsync 1 -max_muxing_queue_size 9999 -f segment -segment_time 600 ^
-segment_wrap 9 -reset_timestamps 1 C:\Users\djcim\Videos\PC\Camera\CPC%02d.ts ^
-thread_queue_size 9999 -f dshow -video_size 3440x1440 -rtbufsize 2147.48M -framerate 100 -pixel_format nv12 ^
-itsoffset 00:00:00.215 -i video="Video (00 Pro Capture HDMI 4K+)" -thread_queue_size 9999 -guess_layout_max 0 -f dshow ^
-rtbufsize 2147.48M -i audio="SPDIF/ADAT (1+2) (RME Fireface UC)" -map 1:0,2:0 -map 6:0 -c:v h264_nvenc -preset: llhp ^
-pix_fmt nv12 -b:v 250M -minrate 250M -maxrate 250M -bufsize 250M -b:a 384k -ac 2 -r 100 -af "adelay=141|141" -vsync 1 ^
-max_muxing_queue_size 9999 -f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 ^
C:\Users\djcim\Videos\PC\PC\PC%02d.ts
Я думал, что с моей частотой кадров все было в порядке, конечно, ffmpeg время от времени дублировал кадры, но я подумал, что это было случайное явление, вызванное сбросом ffmpeg кадра во время обработки, и поэтому мне нужно было дублировать один, чтобы создать его. Я не думал, что дублирование нескольких кадров будет заметным на кадрах... пока я не просмотрел некоторые из первого вывода, который на самом деле представляет собой камеру, и не заметил очень слабых заиканий последовательно 3 раза в минуту. Это стало меня беспокоить, это было очень заметно, и я хотел плавные кадры. Немного запутавшись, я решил попробовать первый вывод сам и посмотреть ffmpeg, чтобы увидеть, когда кадры дублируются, и обнаружил, что он дублирует кадры каждые 17 секунд (точнее, 16.66).
После выполнения математики (1/16,66= 0,06) я понял, что частота кадров этой первой карты захвата на самом деле была 59,94. Делая то же самое для другого вывода, я обнаружил, что мои кадры со "100fps" на самом деле 99,98. Но что это в действительности влечет за собой?
Должен ли я изменить fps на 59,94 и 99,98? Разве это не вызывает проблемы синхронизации, так как 99,98 (100*.0002=99,98) не соответствует стандарту 59,94 (60*.001=59,94)? Или это означает, что мне просто нужно установить второй выход на 99,9 (100*.001=99,9), чтобы соответствовать стандарту первого вывода и отбрасывания кадров? Если это так, значит ли это, что в моей программе редактирования Adobe Premiere мне нужно было бы экспортировать окончательное видео со скоростью 59,94 кадра в секунду, а не 60 кадров в секунду, чтобы избежать дублирования кадров? Или есть какой-то метод во временном коде, который устраняет эту проблему?
Я думаю, что я действительно не понимаю таймкод / таймкод без пропуска кадров и вообще без пропуска кадров. До вчерашнего дня, когда что-то говорило 60fps, я думал, что это буквально означает 60fps, но я думаю, что в 99% случаев это на самом деле означает 59.94. Я действительно хотел бы просто избежать дублирования кадров, поскольку это разрушает то, что было бы гладким опытом, но не знаю, смогу ли я, пытаясь все синхронизировать.
Буду признателен за любую помощь или понимание, извините, если мой вопрос немного сбивает с толку, я, несомненно, запутался.
1 ответ
FFmpeg не поддерживает тайм-код пропускаемого кадра ни для чего, кроме 59,94 и 29,97. Если кто-то еще сталкивается с этой проблемой, нечетные частоты кадров, такие как 99,98 (или более распространенные 23,98), должны быть записаны при постоянной частоте кадров в секунду, в этом случае 100 кадров в секунду.
С -framerate 100 и -vsync 1 кадр будет в конечном итоге дублирован, чтобы сохранить частоту кадров в реальном времени, в конечном итоге вам придется иметь дело только с небольшими заиканиями. Или, возможно, вы могли бы установить FPS, чтобы соответствовать более низкому FPS, но тогда вы пропустили бы много FPS.