You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell调用other-transcode/ffmpeg批量处理视频脚本故障排查

脚本存在的核心问题
  • 目录定位完全错误:$video_path 匹配上级目录名称包含"SoSe"的文件夹,实际匹配到的是SoSe22_Theo1_videos_v16、SoSe22_Theo1_videos_v17这类课程版本根目录,后续直接Get-ChildItem $video_path会把目录下的*_KOMPR、*_RAW两个子文件夹都列为遍历对象,既没有定位到存放原始素材的*_RAW文件夹内的MP4文件,也没有排除已经处理完成的v16目录,会重复扫描已处理的旧文件,甚至把文件夹路径传给转码工具导致运行报错。
  • 工作目录不符合工具运行要求:other-transcode默认将输出文件写到执行命令时的当前工作目录,脚本没有提前切换到对应课程的*_KOMPR输出目录执行转码,转码生成的文件会散落在脚本启动时的工作路径下,不会存入指定的压缩输出文件夹。
  • 合并清单生成逻辑顺序、内容均错误:脚本在执行转码操作之前就提前生成了files.txt合并清单,清单里列的是根目录下匹配到的MP4文件名,既不是转码后输出的文件,路径也不对应KOMPR目录位置,后续ffmpeg执行时根本找不到要合并的转码后文件。另外Out-File加了-Append参数,如果之前运行残留了旧的temp.txt、files.txt,会把历史旧文件列表追加进去,导致合并的视频混入旧内容、片段顺序错乱。
  • 命令混用导致文件匹配不可靠:在PowerShell中调用cmd平台的findstr命令存在兼容问题:一是findstr中.属于正则通配符,只要文件名中任意位置出现"MP4"字符串就会被匹配,无法精准筛选.MP4后缀的视频;二是没有做后缀大小写兼容,小写.mp4后缀的文件会被漏匹配。
  • ffmpeg合并路径逻辑错误:生成的files.txt中只有文件名没有相对/绝对路径,ffmpeg执行concat合并时会在当前工作目录查找对应视频文件,只要脚本启动位置不在对应KOMPR目录下,就会报文件不存在错误。
修正后的参考脚本

修正后脚本会自动识别所有RAW目录、自动创建对应KOMPR输出目录、转码完成后再生成合并清单,避免上述问题:

# 定位所有存放原始素材的RAW目录
$raw_dirs = Get-ChildItem ..\ -Recurse -Directory | Where-Object { $_.Name -like "*_RAW" }

foreach ($raw_dir in $raw_dirs) {
    # 匹配对应KOMPR输出目录,不存在则自动创建
    $kompr_dir_name = $raw_dir.Name -replace "_RAW$", "_KOMPR"
    $kompr_dir = Join-Path $raw_dir.Parent.FullName $kompr_dir_name
    if (-not (Test-Path $kompr_dir)) {
        New-Item -ItemType Directory -Path $kompr_dir | Out-Null
    }

    # 切换到KOMPR目录作为工作目录,确保转码输出直接存入目标文件夹
    Push-Location $kompr_dir
    # 提前清理历史临时文件和旧的合并文件,避免残留干扰
    Remove-Item .\temp.txt, .\files.txt, .\merged.mp4 -ErrorAction SilentlyContinue

    # 扫描RAW目录下所有MP4文件,兼容大小写,按文件名排序保证片段顺序正确
    $source_videos = Get-ChildItem $raw_dir.FullName -File | Where-Object { $_.Extension -in ".MP4", ".mp4" } | Sort-Object Name

    # 逐个执行转码
    foreach ($video in $source_videos) {
        other-transcode --hevc --mp4 --target 3000 --crop 1920:780:0:0 $video.FullName
    }

    # 转码全部完成后,再生成ffmpeg要求的concat合并清单
    Get-ChildItem .\ -File -Filter "*.mp4" | Where-Object { $_.Name -ne "merged.mp4" } | Sort-Object Name | ForEach-Object {
        "file '$($_.Name)'"
    } | Out-File .\files.txt -Encoding utf8

    # 执行无损合并
    ffmpeg -f concat -safe 0 -i files.txt -c copy merged.mp4

    # 清理临时文件
    Remove-Item .\files.txt -ErrorAction SilentlyContinue

    # 切回原始工作目录
    Pop-Location
}

内容的提问来源于stack exchange,提问作者DarkDiamond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:54:28