分享一个CPU编码AV1视频并实现帧率翻倍的批处理文件

网上下载的很多视频都是24fps、25fps或者30fps,能感觉到画面不流畅。而50/60fps的视频就看起来很流畅。如何将低帧率的视频转码为高帧率的视频呢?下面分享一个批处理文件来实现这个功能。

@echo off
setlocal enabledelayedexpansion

REM 遍历当前目录及子目录下所有 .mp4 文件
for /R %%a in ("*.mp4") do (
    echo ===========================================
    echo 正在处理:%%a

    REM 使用 ffprobe 提取帧率(结果为如 30000/1001)
    for /f %%F in ('ffprobe -v error -select_streams v:0 -show_entries "stream=r_frame_rate" -of "csv=p=0" "%%a"') do (
        set "fps_frac=%%F"
    )


    REM  PowerShell 计算浮点值和帧率翻倍结果
    for /f %%F in ('powershell -command "[math]::Round(([double](!fps_frac!))*2, 3)"') do (
        set "fps_double=%%F"
    )

    echo 源帧率: !fps_frac!  插帧目标: !fps_double! fps

    REM 构建输出文件路径
    set "outfile=%%~dpna_2xFPS.mkv"

    REM 开始转码(可用 start 开启并发处理)
    start "" ffmpeg -i "%%a" -vf "minterpolate=fps=!fps_double!" ^
        -c:v libaom-av1 -crf 32 -b:v 0 -cpu-used 4 -row-mt 1 -tile-columns 2 -tile-rows 1 -g 240 -lag-in-frames 35 ^
        -pix_fmt yuv420p -threads 12 -aq-mode 1 ^
        -aom-params enable-keyframe-filtering=0:enable-chroma-deltaq=1:arnr-strength=4:tune=ssim ^
        -c:a libopus -b:a 64k "!outfile!"
)

pause

将以上代码另存为“xxx.bat”批处理文件,和需要转码的mp4文件放在一起,双击即可开始转码。

这个批处理文件的工作流程是:
1. 遍历目录下所有mp4文件
2. 使用ffprobe获取视频帧率
3. 调用powershell计算翻倍后的帧率
4. 使用libaom-av1编码器编码AV1视频,并通过“minterpolate”滤镜实现帧率翻倍

可以看到,转码命令的开头有一个start命令,这个命令的作用是在新窗口中进行转码,这样就可以实现多个视频同时转码。这样做的原因是,libaom-av1对多核处理器的使用并不充分,单任务在我的电脑上CPU使用率只有不到30%,所以需要使用多任务形式来提高速度。尽可能高的提高CPU使用率。