为啥使用 FFmpeg 缩放时帧数会发生变化?

Posted

技术标签:

【中文标题】为啥使用 FFmpeg 缩放时帧数会发生变化?【英文标题】:Why does the frame count change when scaling with FFmpeg?为什么使用 FFmpeg 缩放时帧数会发生变化? 【发布时间】:2017-03-01 20:52:21 【问题描述】:

我用它来缩放 1920x1080 H.264 视频:

ffmpeg -i IMG_1438.MOV -threads 2 -vf scale=-2:600 IMG_1438_scaledTo600.MOV

And it works great!但这是我的问题:大多数时候,原始文件和缩放文件之间的帧速率完全相同。例如:

$ mediainfo -F IMG_1426.MOV | grep Frame\ rate
Frame rate                               : 29.970
Frame rate                               : 29.970 FPS
Frame rate mode                          : VFR
Frame rate mode                          : Variable
Frame rate                               : 29.970
Frame rate                               : 29.970 (29970/1000) FPS

$ mediainfo -F IMG_1426_scaledTo600.MOV | grep Frame\ rate
Frame rate                               : 29.970
Frame rate                               : 29.970 FPS
Frame rate mode                          : CFR
Frame rate mode                          : Constant
Frame rate                               : 29.970
Frame rate                               : 29.970 (30000/1001) FPS

但有时,帧速率会急剧增加:

$ mediainfo -F IMG_1438.MOV | grep Frame\ rate
Frame rate                               : 25.044
Frame rate                               : 25.044 FPS
Frame rate mode                          : VFR
Frame rate mode                          : Variable
Frame rate                               : 25.044
Frame rate                               : 25.044 FPS

$ mediainfo -F IMG_1438_scaledTo600.MOV | grep Frame\ rate
Frame rate                               : 120.000
Frame rate                               : 120.000 FPS
Frame rate mode                          : CFR
Frame rate mode                          : Constant
Frame rate                               : 120.000
Frame rate                               : 120.000 FPS

关于 FFmpeg、libx264 或 libswscale,我应该了解哪些有助于我理解为什么会发生这种情况的信息? (特别希望收到LordNeckbeard 的来信)。

mediainfo IMG_1438.MOV --Full 输出:

General
Count                                    : 327
Count of stream of this kind             : 1
Kind of stream                           : General
Kind of stream                           : General
Stream identifier                        : 0
Count of video streams                   : 1
Count of audio streams                   : 1
OtherCount                               : 2
Video_Format_List                        : AVC
Video_Format_WithHint_List               : AVC
Codecs Video                             : AVC
Audio_Format_List                        : AAC
Audio_Format_WithHint_List               : AAC
Audio codecs                             : AAC LC
Complete name                            : IMG_1438.MOV
File name                                : IMG_1438
File extension                           : MOV
Format                                   : MPEG-4
Format                                   : MPEG-4
Format/Extensions usually used           : mp4 m4v m4a m4b m4p 3gpp 3gp 3gpp2 3g2 k3g jpm jpx mqv ismv isma f4v
Commercial name                          : MPEG-4
Format profile                           : QuickTime
Internet media type                      : video/mp4
Codec ID                                 : qt  
Codec ID                                 : qt   0000.00 (qt  )
Codec ID/Url                             : http://www.apple.com/quicktime/download/standalone.html
CodecID_Version                          : 0000.00
CodecID_Compatible                       : qt  
Codec                                    : MPEG-4
Codec                                    : MPEG-4
Codec/Extensions usually used            : mp4 m4v m4a m4b m4p 3gpp 3gp 3gpp2 3g2 k3g jpm jpx mqv ismv isma f4v
File size                                : 113990140
File size                                : 109 MiB
File size                                : 109 MiB
File size                                : 109 MiB
File size                                : 109 MiB
File size                                : 108.7 MiB
Duration                                 : 52268
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 00:00:52.268
Duration                                 : 00:00:52:09
Duration                                 : 00:00:52.268 (00:00:52:09)
Overall bit rate                         : 17447026
Overall bit rate                         : 17.4 Mb/s
Frame rate                               : 25.044
Frame rate                               : 25.044 FPS
Frame count                              : 1309
Stream size                              : 56670
Stream size                              : 55.3 KiB (0%)
Stream size                              : 55 KiB
Stream size                              : 55 KiB
Stream size                              : 55.3 KiB
Stream size                              : 55.34 KiB
Stream size                              : 55.3 KiB (0%)
Proportion of this stream                : 0.00050
HeaderSize                               : 28
DataSize                                 : 113966271
FooterSize                               : 23841
IsStreamable                             : No
Encoded date                             : UTC 2016-10-08 22:51:19
Tagged date                              : UTC 2016-10-08 22:52:12
File last modification date              : UTC 2016-10-08 22:51:19
File last modification date (local)      : 2016-10-08 17:51:19
Writing library                          : Apple QuickTime
Writing library                          : Apple QuickTime
Encoded_Library_Name                     : Apple QuickTime
com.apple.quicktime.make                 : Apple
com.apple.quicktime.model                : iPhone 5
com.apple.quicktime.software             : 10.0.2
com.apple.quicktime.creationdate         : 2016-10-08T17:51:19-0500

Video
Count                                    : 334
Count of stream of this kind             : 1
Kind of stream                           : Video
Kind of stream                           : Video
Stream identifier                        : 0
StreamOrder                              : 0
ID                                       : 1
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format/Url                               : http://developers.videolan.org/x264.html
Commercial name                          : AVC
Format profile                           : High@L4.1
Format settings                          : CABAC / 1 Ref Frames
Format settings, CABAC                   : Yes
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 1
Format settings, ReFrames                : 1 frame
Internet media type                      : video/H264
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Codec ID/Url                             : http://www.apple.com/quicktime/download/standalone.html
Codec                                    : AVC
Codec                                    : AVC
Codec/Family                             : AVC
Codec/Info                               : Advanced Video Codec
Codec/Url                                : http://developers.videolan.org/x264.html
Codec/CC                                 : avc1
Codec profile                            : High@L4.1
Codec settings                           : CABAC / 1 Ref Frames
Codec settings, CABAC                    : Yes
Codec_Settings_RefFrames                 : 1
Duration                                 : 52268
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 00:00:52.268
Duration                                 : 00:00:52:09
Duration                                 : 00:00:52.268 (00:00:52:09)
Bit rate                                 : 17375530
Bit rate                                 : 17.4 Mb/s
Width                                    : 1920
Width                                    : 1 920 pixels
Height                                   : 1080
Height                                   : 1 080 pixels
Stored_Height                            : 1088
Sampled_Width                            : 1920
Sampled_Height                           : 1080
Pixel aspect ratio                       : 1.000
Display aspect ratio                     : 1.778
Display aspect ratio                     : 16:9
Rotation                                 : 90.000
Rotation                                 : 90°
Frame rate mode                          : VFR
Frame rate mode                          : Variable
Frame rate                               : 25.044
Frame rate                               : 25.044 FPS
Minimum frame rate                       : 23.077
Minimum frame rate                       : 23.077 FPS
Maximum frame rate                       : 30.000
Maximum frame rate                       : 30.000 FPS
Frame count                              : 1309
Resolution                               : 8
Resolution                               : 8 bits
Colorimetry                              : 4:2:0
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Chroma subsampling                       : 4:2:0
Bit depth                                : 8
Bit depth                                : 8 bits
Scan type                                : Progressive
Scan type                                : Progressive
Interlacement                            : PPF
Interlacement                            : Progressive
Bits/(Pixel*Frame)                       : 0.335
Stream size                              : 113523046
Stream size                              : 108 MiB (100%)
Stream size                              : 108 MiB
Stream size                              : 108 MiB
Stream size                              : 108 MiB
Stream size                              : 108.3 MiB
Stream size                              : 108 MiB (100%)
Proportion of this stream                : 0.99590
Title                                    : Core Media Video
Encoded date                             : UTC 2016-10-08 22:51:19
Tagged date                              : UTC 2016-10-08 22:52:12
Color range                              : Limited
colour_description_present               : Yes
Color primaries                          : BT.709
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.709

Audio
Count                                    : 272
Count of stream of this kind             : 1
Kind of stream                           : Audio
Kind of stream                           : Audio
Stream identifier                        : 0
StreamOrder                              : 1
ID                                       : 2
ID                                       : 2
Format                                   : AAC
Format/Info                              : Advanced Audio Codec
Commercial name                          : AAC
Format profile                           : LC
Codec ID                                 : 40
Codec                                    : AAC LC
Codec                                    : AAC LC
Codec/Family                             : AAC
Codec/CC                                 : 40
Duration                                 : 52268
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 00:00:52.268
Duration                                 : 00:00:52:15
Duration                                 : 00:00:52.268 (00:00:52:15)
Source duration                          : 52338
Source duration                          : 52 s 338 ms
Source duration                          : 52 s 338 ms
Source duration                          : 52 s 338 ms
Source duration                          : 00:00:52.338
Bit rate mode                            : CBR
Bit rate mode                            : Constant
Bit rate                                 : 64000
Bit rate                                 : 64.0 kb/s
Channel(s)                               : 1
Channel(s)                               : 1 channel
Channel positions                        : Front: C
Channel positions                        : 1/0/0
ChannelLayout                            : C
Samples per frame                        : 1024
Sampling rate                            : 44100
Sampling rate                            : 44.1 kHz
Samples count                            : 2305019
Frame rate                               : 43.066
Frame rate                               : 43.066 FPS (1024 spf)
Frame count                              : 2251
Source frame count                       : 2254
Compression mode                         : Lossy
Compression mode                         : Lossy
Stream size                              : 410424
Stream size                              : 401 KiB (0%)
Stream size                              : 401 KiB
Stream size                              : 401 KiB
Stream size                              : 401 KiB
Stream size                              : 400.8 KiB
Stream size                              : 401 KiB (0%)
Proportion of this stream                : 0.00360
Source stream size                       : 410894
Source stream size                       : 401 KiB (0%)
Source stream size                       : 401 KiB
Source stream size                       : 401 KiB
Source stream size                       : 401 KiB
Source stream size                       : 401.3 KiB
Source stream size                       : 401 KiB (0%)
Source_StreamSize_Proportion             : 0.00360
Title                                    : Core Media Audio
Encoded date                             : UTC 2016-10-08 22:51:19
Tagged date                              : UTC 2016-10-08 22:52:12

Other #1
Count                                    : 112
Count of stream of this kind             : 2
Kind of stream                           : Other
Kind of stream                           : Other
Stream identifier                        : 0
Stream identifier                        : 1
Type                                     : meta
Duration                                 : 52268
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 00:00:52.268
Duration                                 : 00:00:52.268
Frame count                              : 6
Bit rate mode                            : VBR

Other #2
Count                                    : 112
Count of stream of this kind             : 2
Kind of stream                           : Other
Kind of stream                           : Other
Stream identifier                        : 1
Stream identifier                        : 2
Type                                     : meta
Duration                                 : 52268
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 52 s 268 ms
Duration                                 : 00:00:52.268
Duration                                 : 00:00:52.268
Frame count                              : 1
Bit rate mode                            : CBR

ffprobe IMG_1438.MOV 输出:

ffprobe version 3.1.3 Copyright (c) 2007-2016 the FFmpeg developers
  built with Apple LLVM version 7.3.0 (clang-703.0.31)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --disable-lzma --enable-vda
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 48.101 / 57. 48.101
  libavformat    57. 41.100 / 57. 41.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 47.100 /  6. 47.100
  libavresample   3.  0.  0 /  3.  0.  0
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'IMG_1438.MOV':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2016-10-08 22:51:19
    com.apple.quicktime.make: Apple
    com.apple.quicktime.model: iPhone 5
    com.apple.quicktime.software: 10.0.2
    com.apple.quicktime.creationdate: 2016-10-08T17:51:19-0500
  Duration: 00:00:52.27, start: 0.000000, bitrate: 17446 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 17375 kb/s, 25.04 fps, 120 tbr, 600 tbn, 1200 tbc (default)
    Metadata:
      rotate          : 90
      creation_time   : 2016-10-08 22:51:19
      handler_name    : Core Media Data Handler
      encoder         : H.264
    Side data:
      displaymatrix: rotation of -90.00 degrees
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 62 kb/s (default)
    Metadata:
      creation_time   : 2016-10-08 22:51:19
      handler_name    : Core Media Data Handler
    Stream #0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
    Metadata:
      creation_time   : 2016-10-08 22:51:19
      handler_name    : Core Media Data Handler
    Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
    Metadata:
      creation_time   : 2016-10-08 22:51:19
      handler_name    : Core Media Data Handler
Unsupported codec with id 0 for input stream 2
Unsupported codec with id 0 for input stream 3

更新 澄清一下:我上面的视频,缩放后具有高帧率(120 FPS)输出的视频,在使用 FFmpeg 缩放之前和之后都能完美播放(没有同步问题,120 FPS 的文件大小仅大 14% 左右),我是只是试图理解为什么会发生这种帧率增加(只是稍微超出了 Mulvya 的说明,即存储在容器中的帧率是错误的)。

从编程的角度来看,我遇到的最初问题是我使用 FFmpeg 的 sterr 控制台输出中的frame= 来确定进度,当输出的帧数急剧增加时,它会报告错误的结果(“我是 372%完成编码?!”);从read another *** answer 开始,我将代码更改为使用time=,这对我来说似乎是一种更可靠的方式来显示FFmpeg 进度。 (当然,还有 FFmpeg 的 -progress 选项)。

对原有命令的改进

我用于缩放、保持有用帧率和优化线程的新命令:

ffmpeg -i IMG_1438.MOV -vf scale=-2:600 -r 30 -vsync 0 IMG_1438_scaledTo600.MOV

其中30 是来自mediainfo 的“最大帧速率”。

感谢 cmets 的帮助,我现在知道我不完全理解 FFmpeg 对时间戳的三种不同时基的使用:tbntbctbr。 他们被Robert Swain in 2009解释过,他的解释也被answer a *** question about tbn, tbc, tbr使用过。

在我看来,当我将来自 Mulvya 和 Michael Rampe at another forum 的 cmets 放在一起时,tbr 被猜到了;当从可变帧速率视频更改为恒定帧速率视频时,它通常但并不总是最好的值。

剩下这两个问题...

(1) "field rate and frame rate" 不同时tbr 不正确?这种情况经常发生吗? (2) -r 30 其中30mediainfo 报告的最大帧速率是大多数编解码器/容器组合的最佳方法吗? (或者我应该只在缩放 H.264/MPEG-4 AVC 视频时使用此方法?)

【问题讨论】:

您的源文件是可变速率的。因此,要么 1438 的间隔帧数多于 25 帧,要么容器中存储的帧速率错误。使用ffmpeg -i IMG_1438.MOV -threads 2 -vf scale=-2:600 -vsync 0 IMG_1438_scaledTo600.MOV,但显示 ffprobe 和 mediainfor 对于 1438 的 full 输出。 @ajmicek 我不能说Mulvya没有...控制台输出会很有帮助。不相关,但您可以删除 -threads 2 并让 libx264 自动选择最佳线程数。 我添加了mediainfoffprobe 的完整输出。谢谢你们到目前为止的想法。 ffprobe 将容器存储的帧速率显示为 120 (120 tbr)。将-r 30 -vsync 0 添加到您的命令中。 (使用 30 是视频期间的最大速率,请参阅完整的 mediainfo 输出;视频部分) 根据你们俩的输入和关于tbr 的两个问题,用代码更新了我的问题。你们俩都非常乐于助人,我真的很感激。 【参考方案1】:

(1) 当“场频和帧频”不同时,tbr 不正确?这种情况经常发生吗?

取决于所使用的编码/渲染应用程序和编解码器。请注意,tbr 指的是帧速率而不是场速率。 50 个场对仍存储在 25 个帧中。所以,这本身并不是答案。

(2) 是 -r=30,其中 30 是 mediainfo 报告的最大帧速率最好的方法...

如果您希望编码为恒定帧速率流,那么可以,添加-r max(中间没有= 符号。)。否则只使用-vsync 0。默认情况下,FFmpeg 在输出到 MOV/MP4 时会编码为 CRF 流,并且它引用 tbr 以供使用的值。因此,当流实际上包含较少的帧时,它会复制帧以便满足 tbr 值。使用最大值的原因。 CFR 编码的帧速率是这样的,因此不会丢失任何帧。使用较低的值,输入将具有更多帧数的部分,ffmpeg 将下降以满足您设置的r

【讨论】:

我的代码正确输出了ffmpeg命令;我只是一直打那个等号! (我应该在这里复制并粘贴我的代码的输出。)感谢语法更正。 您的答案是问题的关键,您对ffmpeg 的默认行为的注释特别有帮助,因为我愿意深入挖掘它的来源,但我的结论从这样做是模棱两可的,充其量。此对话帮助我了解了我的理解中缺少的内容,我发现these frame rate basics 特别有助于填补我的理解中的空白。

以上是关于为啥使用 FFmpeg 缩放时帧数会发生变化?的主要内容,如果未能解决你的问题,请参考以下文章

如何将运动物理函数缩放到每秒帧数(在游戏引擎中)?

CSS:为啥 chrome 中的字母在像素缩放中被不同的颜色包围?

chartView:轴值在缩放时发生变化

边框半径和浏览器缩放

FFMpeg SDK使用8调用FFmpeg SDK实现视频缩放

FFMPEG 在单个命令中缩放和裁剪