op200 发表于 2024-12-5 01:07:23

封装mp4恒定帧率(CFR)变动态帧率(VFR)?最神奇的一集

本帖最后由 op200 于 2024-12-17 21:08 编辑

恒定帧率的mkv源


帧率模式 :恒定帧率 (CFR)
帧率 :23.976 (24000/1001) FPS



重封装成mp4,会神奇地变成VFR


帧率模式 :动态帧率 (VFR)
帧率 :23.976 (24000/1001) FPS
最低帧率 :23.810 FPS
最高帧率 :24.390 FPS



起初我以为是mp4封装器的原因,今天我在论坛查了下其他网u的结论,是mkv的时间码计算方式和mp4不同,所以从某种角度来说是mkv的时间码出问题了,而不是mp4

所以mkv转mp4封装需要覆写时间码


废话不多说,直接上脚本(非常简陋的脚本,仅供能运行起来)
脚本依赖 mp4box 和 mp4fpsmod


::2024.12.14

@echo off
color 70&title 封装mp4


echo 用法:    先用 MKVToolNix 对文件进行标准封装,例如改好轨道名、改好轨道语言、封入章节……
echo   然后运行此脚本将封装好的mkv文件转为mp4文件
echo.


set /p in=输入文件路径名:
set in="%in:"=%"

set /p o=输出文件路径名:
set o="%o:"=%"

if not "%o:~-5%==".mp4" (
    set o=%o:~0,-1%.mp4"
)


set fps=24000/1001
set /p fps=输入帧率(分数,默认值为'%fps%',直接回车则使用默认值):




@echo on
mp4box -add %in% -new %o:~0,-1%.temp.mp4"
mp4fpsmod -r 0:%fps% -o %o% %o:~0,-1%.temp.mp4"
@echo off


if exist %o:~0,-1%.temp.mp4" (del /q %o:~0,-1%.temp.mp4")

choice /c e


如果复制这个脚本,需要保存为GB编码,用记事本保存的话,保存为ANSI(系统默认编码),这样才能支持非ASCII字符


注意:之前的脚本存在bug,会导致关键帧信息丢失,使视频失去随机跳转能力,现在已经修改脚本
页: [1]
查看完整版本: 封装mp4恒定帧率(CFR)变动态帧率(VFR)?最神奇的一集