我可以使用 ffmpeg 将可变帧率视频转换为恒定帧率视频而无需重新编码吗?

我可以使用 ffmpeg 将可变帧率视频转换为恒定帧率视频而无需重新编码吗?

我有一个 VFR 视频(请参阅下面的媒体信息),其中包含 24p 和 30p 视频的混合。此视频的来源是混合帧速率 DVD(星际迷航:航海家),其中包含隔行 NTSC 视频 CGI 和复合场景以及 24p 拍摄场景。许多播放器可以很好地处理此视频,但我的新电视不支持可变帧速率,并将所有视频强制为 24 fps,这会导致 30 fps 场景出现严重抖动。

我想使用 ffmpeg 将此视频转换为恒定的 60fps(嗯,可能是 59.94),这样电视就不必这样做了。我意识到这涉及到下拉。我想知道 ffmpeg 是否提供了一组设置,可以输出 60fps 的视频文件,而无需实际重新编码视频。我想如果可能的话,它将涉及更改帧上的时间戳。而且音频和子图片流也需要保留。

那可能吗?

Format                                   : Matroska
Format version                           : Version 2
File size                                : 407 MiB
Duration                                 : 45 min 55 s
Overall bit rate                         : 1 239 kb/s
Encoded date                             : UTC 2016-06-12T02:23:20Z
Writing application                      : HandBrake 0.10.5 2016021100
Writing library                          : Lavf55.12.0

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L3
Format settings                          : CABAC / 5 Ref Frames
Format settings, CABAC                   : Yes
Format settings, Reference frames        : 5 frames
Codec ID                                 : V_MPEG4/ISO/AVC
Bit rate                                 : 767 kb/s
Width                                    : 710 pixels
Height                                   : 480 pixels
Display aspect ratio                     : 4:3
Frame rate mode                          : Variable
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Writing library                          : x264 core 142 r2479 dd79a61
Encoding settings                        : cabac=1 / ref=5 / deblock=1:-1:-1 / analyse=0x3:0x113 / me=umh / subme=8 / psy=1 / psy_rd=1.00:0.15 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-3 / threads=12 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=240 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=50 / rc=crf / mbtree=1 / crf=20.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
Default                                  : Yes
Forced                                   : No
Color range                              : Limited
Color primaries                          : BT.601 NTSC
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.601

Audio
ID                                       : 2
Format                                   : AC-3
Format/Info                              : Audio Coding 3
Commercial name                          : Dolby Digital
Codec ID                                 : A_AC3
Duration                                 : 45 min 55 s
Bit rate mode                            : Constant
Bit rate                                 : 448 kb/s
Channel(s)                               : 6 channels
Channel layout                           : L R C LFE Ls Rs
Sampling rate                            : 48.0 kHz
Frame rate                               : 31.250 FPS (1536 SPF)
Compression mode                         : Lossy
Stream size                              : 147 MiB (36%)
Title                                    : Surround
Language                                 : English
Service kind                             : Complete Main
Default                                  : Yes
Forced                                   : No

Text
ID                                       : 3
Format                                   : VobSub
Codec ID                                 : S_VOBSUB
Codec ID/Info                            : Picture based subtitle format used on DVDs
Language                                 : English
Default                                  : No
Forced                                   : No

Menu
00:00:00.000                             : :Chapter 1
00:04:59.415                             : :Chapter 2
00:11:16.409                             : :Chapter 3
00:19:01.957                             : :Chapter 4
00:24:40.328                             : :Chapter 5
00:28:42.120                             : :Chapter 6
00:35:06.954                             : :Chapter 7
00:40:09.890                             : :Chapter 8

答案1

答案是“不可以”。你不能这么做。帧速率的 ffmpeg 过滤器必然要求对视频流进行重新编码。

然而,就我而言,解决方案实际上非常简单。尽管视频流具有可变的帧速率,但 MKV 标头有一个“默认持续时间”字段,该字段表示每帧的“默认”帧速率(以纳秒为单位)。一些播放器(至少是我电视上的播放器)使用此值来确定如何播放视频。在这种情况下,虽然 Mediainfo 没有显示,但 MKV 的默认帧速率为 24 fps。

我最终使用 mkvpropedit 将默认持续时间值更改为与 59.94 fps 匹配的值。这可以欺骗我的 LG CX 将视频视为 60 fps 视频。23.97 的内容看起来仍然很流畅,当它转换为 29.97 时,它仍然很流畅。我编写了一个批处理文件来一次性对文件夹中的所有文件执行此操作,它看起来像这样:

for /r %%i in (*.mkv) do mkvpropedit.exe "%%i" --edit track:v1 --set default-duration=16683333

16683333 是 59.94 帧率视频帧的持续时间(以纳秒为单位)。因此,基本上,这会导致 LG CX 每秒预期 60 帧而不是 24 帧,因此它不会在 30fps 内容期间丢帧。

相关内容