视频重新编码,缩小视频文件

最近更新于 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 <视频文件名>

file

然后我用 FFmpeg 将视频重新编码为 h265 后,文件大小就分别只有 1.48 MB 和 844 KB。

好多电影动不动几 GB 甚至十多 GB 的,通过重新编码后大大缩小。
这里两百多部电影都是经过重新压缩的,总体积也才 105 GB。

另外还有五百多集的动漫,占用只有 44.3 GB,都是重新编码过的
file

我之前写了一个 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

视频重新编码,缩小视频文件
Scroll to top