代码之家  ›  专栏  ›  技术社区  ›  ninbura

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

  •  0
  • ninbura  · 技术社区  · 6 年前

    我使用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 回复  |  直到 6 年前
        1
  •  0
  •   ninbura    6 年前

    FFmpeg不支持除59.94和29.97以外的任何内容的drop frame timecode。如果其他人也遇到过这个问题,那么像99.98(或更常见的23.98)这样的奇数帧速率应该以实时常量FPS记录,在这种情况下为100FPS。

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