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
相关产品推荐
相关产品推荐

