Skip to content

Latest commit

 

History

History
27 lines (16 loc) · 2.28 KB

NTSC制式帧率转换.md

File metadata and controls

27 lines (16 loc) · 2.28 KB

NTSC制式帧率转换


NTSC(National Television Standards Committee), 即美国国家电视标准委员会制定的标准电视广播传输和接收协议, 因为历史原因, 在从黑白电视向彩色电视过度期, 制定了一套同时兼容黑白和彩色信号的标准, 为了解决传输中的信号干扰等问题, 就在标准中稍微调低了画面帧率(下调1/1000), 于是就产生了一些特殊的非整数的帧率值, 例如: 23.976(从24/1调低而来), 29.97(从30/1调低而来), 59.94(从60/1调低而来), 47.952(从48/1调低而来)等等

与NTSC制式对应的同样广泛使用的电视信号制式PAL中就不存在上述的非整数帧率, 因为PAL制式的制定年代要晚于NTSC制式, 在标准制定时就已经将NTSC标准制定时遇到的问题加以规避, 并在制定时不考虑向下兼容旧式黑白电视机

在使用FFmpeg对视频文件进行转码时, 可以通过指定参数(-r), 调整输出的帧率, 一般情况下直接使用数值表的帧率即可, 但对于上述提到的NTSC制式下的非整数帧率, 需要注意, 不可以直接使用诸如 23.976 这样的数值用-r作参数的值, 否则转码输出结果并不是期望的

例如:

设, 有原文件test.mp4原始帧率为"30/1", 目前有需求需要将其转换为 29.97 帧率的 mp4 文件, 如果直接使用 -r 29.97 设置参数

ffmpeg -i test.mp4 -c:v libx264 -c:a aac -r 29.97 -f mp4 -y output.mp4

通过查看输出文件output.mp4的元信息, 可以发现其帧率(r_frame_rate或avg_frame_rate)的值为 "2997/100", 意为: 每100秒的视频流内, 包含2997幅画面(帧), 这其实并不是NTSC制式下帧率29.97的描述, 在NTSC制式下, 帧率29.97的值应 "30000/1001", 即每1001秒的视频流中包含30000幅画面(帧), 所谓的帧率 29.97 其实仅仅是这个比值除法计算结果的近似值而已, 因此在转码时需要特别注意

正确的帧率转换命令应为:

ffmpeg -i test.mp4 -c:v libx264 -c:a aac -r 30000/1001 -f mp4 -y output.mp4

?> 为了规避此类问题, 建议在使用FFmpeg转码时, 如果需要使用 -r 参数指定输出的帧率, 其参数值一律使用比值, 不使用数值