最近想找一款视频格式转换工具,可以满足以下的需求:
- 只需要设置分辨率、编码格式,不要把参数全部罗列出来让我去设置;
- 如果视频本身的分辨率小于设定值,就沿用视频本身的分辨率;
- 可以批量转换。
然而网上搜了一下,没有找到满足需求的。想到大多数视频格式转换工具,都是基于 ffmpeg 开发的桌面应用,干脆自己写个脚本来调用 ffmpeg 就好了。下面将一步步实现该脚本。
首先,需要下载 ffmpeg 和 Gow。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!
)
大功告成,赶紧用起来吧。