批量视频格式转换

最近想找一款视频格式转换工具,可以满足以下的需求:

  • 只需要设置分辨率、编码格式,不要把参数全部罗列出来让我去设置;
  • 如果视频本身的分辨率小于设定值,就沿用视频本身的分辨率;
  • 可以批量转换。

然而网上搜了一下,没有找到满足需求的。想到大多数视频格式转换工具,都是基于 ffmpeg 开发的桌面应用,干脆自己写个脚本来调用 ffmpeg 就好了。下面将一步步实现该脚本。

首先,需要下载 ffmpegGow。Gow 提供了常用的 Unix 命令的 Windows 版本,会让事情变得简单些。

然后,遍历当前文件夹下的所有视频文件,逐一进行格式转换。

@echo off

setlocal enabledelayedexpansion

set convert=path_to_ffmpeg_exe
set probe=path_to_ffprobe_exe
rem 转换后的文件保存在 output 目录中。
set output=output

rem 转换后的文件后缀。
set flag=out
rem 转换后的文件长边限制为 1280。如果是横屏视频,则宽度不超过 1280;如果是竖屏视频,则高度不超过 1280;保持原视频的宽高比。
set long_edge=1280
set vf_landscape=-vf "scale=!long_edge!:-2"
set vf_portrait=-vf "scale=-2:!long_edge!"

rem 处理扩展名为 mp4 和 mkv 的视频。
set ext_list=mp4 mkv

for %%a in (%ext_list%) do (
    set ext=%%a
    for %%i in (*.!ext!) do (
        echo %%i | findstr /i /c:"%flag%" > nul
        if !errorlevel! neq 0 (
            set src=%%i
            set dst=!src:~0,-4!.%flag%.mp4

            rem 探测视频的宽度和高度,决定是否需要缩放。
            rem 探测占位
            rem 转换编码格式。
            rem 转码占位
        )
    )
)

接下来,通过 ffprobe.exe 来探测视频的宽度和高度,决定是否需要缩放。将下面的脚本拷贝到“探测占位”即可。

rem 探测视频的宽度和高度,决定是否需要缩放。
set width=0
set height=0
set temp=temp.txt

%probe% -v quiet -show_entries stream=width,height -of default=noprint_wrappers=1 !src! > !temp!

sed -i "s/=/:/g" !temp!
rm -rf sed*

for /f "tokens=1,2 delims=:" %%p in ('cat !temp!') do (
    if "%%p" == "width" (
        set width=%%q
    ) else if "%%p" == "height" (
        set height=%%q
    )
)

rm -rf !temp!

紧接着,通过 ffmpeg.exe 来转换编码格式。将下面的脚本拷贝到“转码占位”即可。

rem 转换编码格式。
set vt=

if !width! gtr !height! (
    if !width! gtr !long_edge! (
        rem 横屏视频,并且宽度大于指定值,需要缩放。
        set vf=%vf_landscape%
    )
) else (
    if !height! gtr !long_edge! (
        rem 竖屏视频,并且高度大于指定值,需要缩放。
        set vf=%vf_landscape%
    )
)

rem 指定画面使用 h264 编码,码率为 crf 22
rem 指定声音使用 aac 编码,码率为 128,采样率为 48000
%convert% -y -i !src! -map 0:v:0 -c:v h264 -preset medium -crf 22 !vf! -map 0:a:0 -c:a aac -b:a 128K -ar 48000 -ac 2 -sn -threads 16 !dst!
choice /t 1 /d y /n > nul

最后是收尾工作,将转换后的文件,拷贝到 output 目录中。

if not exist %output% (
    mkdir %output%
)

for %%i in (*.%flag%.mp4) do (
    set src=%%i
    set dst=!src!
    mv !src! %output%\!dst!
)

大功告成,赶紧用起来吧。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容