Windows 使用 ffmpeg 批量压缩视频文件


共计 2247 个字符,预计需要花费 6 分钟才能阅读完成。

下载了一些视频,感觉默认有点大,于是准备使用 ffmpeg 进行压缩,用了如下命令感觉效果还不错。

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

但是需要压缩的视频有点多,并且我的视频是分类好的,不想压缩的时候整到一个文件夹去到时候又要分文件夹,所以借助 gpt 写出了此脚本,不得不说虽然有 gpt 还是踩坑不少的。

这个脚本能保证原来的目录结构,只需要指定输出目录即可。

@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion

rem 设置 ffmpeg 路径、需要压缩的文件目录,输出文件目录
set "ffmpeg_path=D:\soft\ffmpeg\bin\ffmpeg.exe"
set "input_dir=E:\test3"
set "output_root_dir=E:\Compress"

for /r "%input_dir%" %%F in (*.mp4) do (
    set "input_file=%%F"
    echo 待压缩文件: !input_file!
    call set "output_file=!input_file:%input_dir%=%output_root_dir%!"
    rem echo 压缩后文件: !output_file!
    for %%I in ("!output_file!") do set "output_dir=%%~dpI"
    rem echo 输出目录: !output_dir!
    mkdir "!output_dir!" 2>nul

    rem 检查输入文件是否存在
    if exist "!output_file!" (
        rem 调用函数比较输入文件和输出文件的时长
    echo 输出文件已存在: !output_file!
    call :compare_durations "!input_file!" "!output_file!"
    )else (
    call :compress_file "!input_file!" "!output_file!"
    )

    echo "================================分隔符================================"
)

echo 脚本执行完成!!!!!按任意键退出.
pause

rem  方法===比较视频时长
:compare_durations
set "input_file=%~1"
set "output_file=%~2"

rem 获取输入文件、输出文件的时长
for /F "delims=" %%A in ('%ffmpeg_path% -i "!input_file!" 2^>^&1 ^| findstr /C:"Duration"') do (
    set "input_duration=%%A"
)
for /F "delims=" %%B in ('%ffmpeg_path% -i "!output_file!" 2^>^&1 ^| findstr /C:"Duration"') do (
    set "output_duration=%%B"
)

for /F "tokens=2 delims= " %%C in ("!input_duration!") do (
    set "input_duration=%%C" 
)
for /F "tokens=2 delims= " %%D in ("!output_duration!") do (
    set "output_duration=%%D"
)

rem 忽略毫秒级别比较
for /F "tokens=1 delims=." %%F in ("!input_duration!") do (
    set "input_duration=%%F"
)
for /F "tokens=1 delims=." %%G in ("!output_duration!") do (
    set "output_duration=%%G"
)

rem 比较输入文件和输出文件的时长
rem echo "%input_file%"  时长 ==== "!input_duration!"
rem echo "%output_file%" 时长 ==== "!output_duration!"
if "!input_duration!" neq "!output_duration!" (
    echo 时长不一致,重新压缩文件...
    call :compress_file "!input_file!" "!output_file!"
) else (
    echo 时长一致,无需重新压缩文件.
)

goto :eof

rem 方法===压缩文件
:compress_file
set "input_file=%~1"
set "output_file=%~2"
echo 正在压缩文件: !input_file! 请稍等...
"%ffmpeg_path%" -loglevel quiet -i "!input_file!" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "!output_file!" -y -progress progress.txt 2>&1 | findstr "time=" > con
echo 压缩完成,输出文件为: !output_file! 请稍等...
call :compare_durations "!input_file!" "!output_file!"

goto :eof

执行效果:

Windows 使用 ffmpeg 批量压缩视频文件

/>

如图,已经压缩过的文件如果时长一致,则不进行再次压缩浪费时间;如果时长不一致,那么要进行压缩然后覆盖;如果没有压缩过的文件,直接进行压缩,压缩完再对比时长。

提醒:本文发布于399天前,文中所关联的信息可能已发生改变,请知悉!

Tips:清朝云网络工作室

阅读剩余
THE END