批量合并MP4与SRT字幕脚本报错求助:输出文件无流且生成空.mp4
PowerShell批量FFmpeg合入字幕脚本错误修复
错误根源分析
- 命令调用错误:原脚本中
.fmpeg.exe包含不可见控制字符,且用.(执行脚本的语法)调用ffmpeg可执行文件是错误的,直接导致命令解析异常。 - 文件名参数未加引号:如果视频文件名包含空格,PowerShell会将其拆分为多个参数传递给ffmpeg,导致ffmpeg无法识别完整的输入/输出文件路径,进而生成空的
.mp4文件。 - 字符串替换不可靠:用
$_.Name.Replace(".mp4", ".srt")处理文件名,若文件名中包含多个.mp4子串(如video.backup.mp4),会出现替换错误。
修正后的脚本
基础版(支持含空格的文件名)
Get-ChildItem -Filter *.mp4 | ForEach-Object { $inputFile = $_.Name $subtitleFile = $_.BaseName + ".srt" $outputFile = $_.BaseName + "WithSubs.mp4" ffmpeg.exe -i "$inputFile" -filter:v subtitles="$subtitleFile" -c:a copy -c:v libx264 -crf 22 -preset veryfast "$outputFile" }
增强版(添加字幕文件存在性检查)
避免因缺少字幕文件导致ffmpeg报错,增加跳过逻辑:
Get-ChildItem -Filter *.mp4 | ForEach-Object { $inputFile = $_.Name $subtitleFile = $_.BaseName + ".srt" $outputFile = $_.BaseName + "WithSubs.mp4" if (Test-Path $subtitleFile) { ffmpeg.exe -i "$inputFile" -filter:v subtitles="$subtitleFile" -c:a copy -c:v libx264 -crf 22 -preset veryfast "$outputFile" } else { Write-Warning "字幕文件 $subtitleFile 不存在,跳过处理 $inputFile" } }
关键修改说明
- 修正命令调用:直接使用
ffmpeg.exe调用(若ffmpeg未加入系统PATH,需写完整路径,如C:\ffmpeg\bin\ffmpeg.exe),移除错误的控制字符和.前缀。 - 参数加引号:所有包含文件名的参数用双引号包裹,确保PowerShell将完整文件名传递给ffmpeg。
- 用BaseName处理文件名:
$_.BaseName直接获取不带扩展名的文件名,比字符串替换更可靠,避免多扩展名场景下的替换错误。 - 高效筛选文件:用
Get-ChildItem -Filter *.mp4替代原有的ls | Where逻辑,更简洁高效。
内容的提问来源于stack exchange,提问作者David Stammers
相关产品推荐
相关产品推荐

