最近更新于 2024-05-05 23:20
目前最通用的视频编码器是 H.264/AVC,它的新版 H.265/HEVC 相比于前者可以在相同视频质量的情况下将码率缩小一半,视频文件大小=码率\times视频时长
。
比如,我这里用手机拍摄的两段视频(Redmi Note 12 Pro – MIUI 14.0.2 – Android 13 – 1920×1080),一段 5 秒钟的视频 15.6 MB,另外一段 3 秒钟的视频 9.42 MB
用 FFmpeg 工具查看了编码器是 h264
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 <视频文件名>
然后我用 FFmpeg 将视频重新编码为 h265 后,文件大小就分别只有 1.48 MB 和 844 KB。
好多电影动不动几 GB 甚至十多 GB 的,通过重新编码后大大缩小。
这里两百多部电影都是经过重新压缩的,总体积也才 105 GB。
另外还有五百多集的动漫,占用只有 44.3 GB,都是重新编码过的
我之前写了一个 PowerShell 的脚本专门用来批量编码视频,编码后统一输出视频格式为 .mp4
。
这个脚本依赖于 FFmpeg,用于编码,配置参考:https://blog.iyatt.com/?p=8613
另外,Windows 默认禁止 PowerShell 的脚本运行,需要修改执行策略,配置参考:https://blog.iyatt.com/?p=10735
if (-not (Test-Path -Path "dest")) {
New-Item -ItemType Directory -Path "dest", "src"
}
$video_formats = @("*.mp4", "*.avi", "*.mkv", "*.mov", "*.wmv", "*.flv", "*.mpg", "*.rmvb", "*.rm", "*.dat", "*.ts") # 要匹配的视频格式
$processed = @{}
do {
$new_video = $false
foreach ($format in $video_formats) {
$videos = Get-ChildItem -Path "." -Filter $format
foreach ($video in $videos) {
$name = $video.BaseName
if (-not $processed.ContainsKey($name)) {
$source_video = $video.FullName
$dest_video = "dest\$name.mp4"
# 使用 NVIDIA 显卡解码,并使用 CPU 软件编码为 H.265
ffmpeg.exe -hwaccel cuda -i "$source_video" -c:v libx265 "$dest_video"
$processed[$name] = $true
Start-Sleep -Seconds 2
Move-Item -Path "$source_video" -Destination "src\"
$new_video = $true
}
}
}
} while ($new_video)
将代码复制保存为扩展名为 .ps1 的文件,用 PowerShell 运行就行,脚本会遍历所在目录的视频文件,再进行编码,编码后的视频输出到 dest 目录下,原视频移动到 src 目录下。
基于 PowerShell 7.x 测试
编解码器可以参考:https://blog.iyatt.com/?p=13203