ffmpeg - 时间码和分数帧率(复制帧)

ffmpeg - Timecode & Fractional Frame Rate (Duplicating Frames)

我使用 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=.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) 以匹配第一个输出和丢帧的标准?如果是这种情况,这是否意味着在我的编辑程序 Adob​​e Premiere 中,我需要将最终视频导出为 59.94fps 而不是 60fps 以避免重复帧?或者时间码中是否有某种方法可以解决此问题?

我想我真的不了解丢帧和非丢帧时间码/一般时间码。直到昨天,当有人说 60fps 时,我认为它的字面意思是 60fps,但我猜 99% 的时间它实际上意味着 59.94。我真的很想避免重复帧,因为它会破坏流畅的体验,但我不知道在尝试保持所有内容同步时是否可以。

任何帮助或见解将不胜感激,抱歉,如果我的问题有点令人困惑,我无疑感到困惑。

FFmpeg 不支持 drop-frame 除 59.94 和 29.97 以外的任何时间码。如果其他人遇到过这个问题,奇数帧速率如 99.98(或更常见的 23.98)应该记录为 real-time 恒定 FPS,在这种情况下为 100FPS。

使用 -framerate 100 和 -vsync 1 帧最终将被复制以保持帧速率实时,您最终将不得不处理轻微的卡顿。或者您可以将 FPS 设置为与较低的 FPS 相匹配,但您会错过很多 FPS。