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

时间:2018-03-28 19:20:26

标签: ffmpeg duplicates synchronization frame-rate timecodes

我使用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。我真的很想避免重复帧,因为它会破坏什么是流畅的体验,但不知道我是否可以在尝试保持一切同步时。

任何帮助或见解都会受到赞赏,抱歉,如果我的问题有点令人困惑,我无疑会感到困惑。

1 个答案:

答案 0 :(得分:0)

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

使用-framerate 100和-vsync 1最终会复制一个帧以保持帧速率实时,你最终只需处理轻微的口吃。或者你可以设置FPS以匹配较低的FPS但是你会错过很多FPS。