有没有MOV批量转MP4格式的工具。批量!

有没有MOV批量转MP4格式的工具。批量!

win用。

HandBrake 应该能行:

以前让AI写过ffmpeg的Powershell模板,拿去改改输出参数就行了。

禁忌事项:

  • intel qsv 选项开启时,若与libopus音频编码器同时使用,则必须将用于质量控制的global_quality写作global_quality:v
  • 输出路径不要放在输入路径下,否则可能会引发无限嵌套转换
  • 其他与intel QSV冲突的ffmpeg参数,因为我没怎么用过,所以印象不深,但是我知道还有一些,遇到问题的话,首选搜索reddit,次选搜索github或其他社区
  • ffmpeg无法正确处理 32bit float 格式的很多音频,但是好在视频没人用这么高规格的音轨
param(
    [Parameter(Mandatory=$true)]
    [string]$InputDir,

    [Parameter(Mandatory=$true)]
    [string]$OutputDir,

    [Parameter(Mandatory=$false)]
    [string]$FFmpegPath = "D:\Program\ffmpeg\bin\ffmpeg.exe"
)

# ===============================
# 基础检查
# ===============================

if (!(Test-Path $InputDir)) {
    Write-Error "输入目录不存在: $InputDir"
    exit 1
}

if (!(Test-Path $OutputDir)) {
    Write-Host "输出目录不存在,正在创建: $OutputDir"
    New-Item -ItemType Directory -Path $OutputDir | Out-Null
}

# 检查 FFmpeg 路径
if (-not $FFmpegPath) {
    $FFmpegPath = Read-Host "请输入 ffmpeg 二进制文件的路径 (例如:C:\Program Files\ffmpeg\bin\ffmpeg.exe)"
}

# 去掉路径两侧的引号
$FFmpegPath = $FFmpegPath.Trim('"')

# 检查 ffmpeg 是否存在
if (!(Test-Path $FFmpegPath)) {
    Write-Error "指定的 FFmpeg 路径不存在: $FFmpegPath"
    exit 1
}

# 日志文件
$logFile = Join-Path $OutputDir ("ffmpeg_log_" + (Get-Date -Format "yyyyMMdd_HHmmss") + ".txt")

function Write-Log {
    param([string]$Message)

    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $line = "[$timestamp] $Message"

    Write-Host $line
    Add-Content -Path $logFile -Value $line
}

Write-Log "========== 开始批量转码 =========="
Write-Log "输入目录: $InputDir"
Write-Log "输出目录: $OutputDir"
Write-Log "FFmpeg 路径: $FFmpegPath"

# 支持扩展名
$extensions = ".mp4",".mkv",".avi",".mov",".flv",".wmv"

$success = 0
$failed = 0
$skipped = 0

# ===============================
# 开始递归遍历
# ===============================

Get-ChildItem -Path $InputDir -Recurse -File | 
Where-Object { $extensions -contains $_.Extension.ToLower() } |
ForEach-Object {

    $inputFile = $_.FullName

    # 计算相对路径
    $relativePath = $inputFile.Substring($InputDir.Length).TrimStart("\","/")
    $relativeDir = Split-Path $relativePath -Parent

    # 输出目录保持结构
    $targetDir = Join-Path $OutputDir $relativeDir

    if (!(Test-Path $targetDir)) {
        New-Item -ItemType Directory -Path $targetDir -Force | Out-Null
    }

    # 拼接输出文件名
    $outputFileName = $_.BaseName + $_.Extension
    $outputFile = Join-Path $targetDir $outputFileName

    # 已存在则跳过
    if (Test-Path $outputFile) {
        Write-Log "跳过(已存在): $outputFile"
        $skipped++
        return
    }

    Write-Log "开始处理:"
    Write-Log "输入: $inputFile"
    Write-Log "输出: $outputFile"

    # ====== 关键安全调用方式 ======
    $ffmpegArgs = @(
        "-y"
        "-i", $inputFile
        "-c:v", "libx264"
        "-preset", "medium"
        "-crf", "23"
        "-c:a", "opus"
        "-b:a", "192k"
        $outputFile
    )

    # 使用 & 调用,路径带引号处理
    & $FFmpegPath @ffmpegArgs 2>&1 | ForEach-Object {
        Add-Content -Path $logFile -Value $_
    }

    if ($LASTEXITCODE -ne 0) {
        Write-Log "处理失败: $inputFile"
        $failed++
    }
    else {
        Write-Log "完成: $outputFile"
        $success++
    }

    Write-Log "----------------------------------------"
}

# ===============================
# 统计信息
# ===============================

Write-Log "========== 全部完成 =========="
Write-Log "成功: $success"
Write-Log "失败: $failed"
Write-Log "跳过: $skipped"
Write-Log "日志文件: $logFile"

ffmpeg,或者各种ffmpeg的套皮,视频处理基本都绕不开这个东西

楼上两个,一个是ffmpeg的套皮,另一个是ffmpeg的脚本。

ffmpeg 最简单了吧。

FFmpeg 从功能上讲最为强大,而且现在有 AI 辅助,写一个批量转换的脚本也不是难事。

即使放在过去没有 AI 的时候,其实也有很多通俗易懂的教程,照着这些教程也能完成基本操作:

但个人很多时候不是很愿意直接推荐 FFmpeg,因为我不知道提问者是否有操作命令行、脚本的能力。甚至可能很多人连怎么安装 FFmpeg 都不知道。如果不具备这些基础知识,那么即使有 AI 帮忙写脚本也很难进行下去,莫不如直接推荐个好用的 GUI,好歹操作上更直观。

FFmpeg就挺好的,我之前整理历年积累拍的照片/视频时,嫌视频大,就写了个小工具调用FFmpeg批量转到AV1编码的mp4,把整个文件夹或多个视频文件拖到exe图标上即可(实际就是用这个exe打开这些文件),可自定义转码参数(内置了几条CPU/A卡加速的转码参数,N卡要自己填参数,拿参考示例去找AI问问即可)

下载 ffmpeg-git-full.7z 解压出 FFmpeg.exe 放一起就行

都是FFmpeg的壳,我也分享个python脚本,最近刚找ai搓的

行数太大了发不出来,下面是我的小网盘

访问密码是:1234

系统安装了python的下载 FFmpeg简易转换合并.pyw 运行

预设文件 ffmpeg_presets 下不下都无所谓,只是演示一些参数怎么填

不想安装python可以下载我找github自动编译好的FFmpeg简易转换合并.exe

FFmpeg我也去官网下载了最新的share版本上传到网盘了,下载后解压到脚本/程序同目录

或者配置到环境变量里(新手忽略这句话)

share版本的ffmpeg ffplay ffprobe公用运行库,所以体积小点,就是文件比较零碎,单文件的每个都单独包含了运行库,加起来会很大,这个脚本我用了FF全家桶,所以share版划算点

因为是找ai搓的,我自己也只刚测试了半个月,有啥问题我也不知道,不过对于mov批量转mp4还是能对付的

打开脚本/程序后, 点击上半那些选项配置好参数模版,把你要批量转换的文件拖进去,就会按模版创建到下面的列表

下面列表表头上显示数量的框,前面是总数量,如果选的cpu软编码,你可以按你cpu性能选数量,最好不超过3,

后面是显示硬件编码的数量,如果你选的硬件编码,如果超过2个,文件可能会在显卡内存里打架,所以不要超过2

列表选择文件双击还可以微调

2个大按钮是单个文件转换按钮,必须在上面选择输入文件

下面队列的按钮是管队列的

第一页的功能感觉解决了HandBrake90%

像素格式记得点击取消一下,我默认的是有损的,因为我转换需求是为了传手机看


第二页的功能类似mkvtoolnix,不过这个只模仿了30%,对于轨道的默认 语言 那些没有处理,就是简单的多流合并,可以无损复制,也可以转换一下编码,

这个功能主要是为了解决一下网站视频下载下来是音频视频分开2个文件的合并问题,所以没深入挖掘功能

画中画功能的初衷是舞台多机位合并, 画中画的主从视频必须选编码格式重新编码,而不能用copy无损复制了

可以在主视频的预览里看到从视频的位置演示框, 主视频偏移功能是为了全舞台给竖舞台让点位置,比如-100就向左边让100,点了偏移功能后必须获取一下主视频的大小,

主视频的偏移在预览里看不到,编码后是能体现的

这一页也支持拖拽,多个文件,点击选择一个作为主视频流,或者选all,全部作为从音频流,画中画的视频是用画中画按钮添加