我使用 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) 以匹配第一个输出和丢帧的标准?如果是这种情况,这是否意味着在我的编辑程序 Adobe Premiere 中,我需要将最终视频导出为 59.94fps 而不是 60fps 以避免重复帧?或者时间码中是否有一些方法可以解决这个问题?
我想我只是真的不了解丢帧和非丢帧时间码/时间码。直到昨天,当有人说 60fps 时,我认为它的字面意思是 60fps,但我猜 99% 的时间它实际上意味着 59.94。我真的很想避免重复帧,因为它会破坏流畅的体验,但不知道我是否可以在尝试保持所有内容同步的同时。
任何帮助或见解将不胜感激,对不起,如果我的问题有点令人困惑,我无疑会感到困惑。