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

批量合并MP4与SRT字幕脚本报错求助:输出文件无流且生成空.mp4

PowerShell批量FFmpeg合入字幕脚本错误修复

错误根源分析

  1. 命令调用错误:原脚本中. fmpeg.exe包含不可见控制字符 ,且用.(执行脚本的语法)调用ffmpeg可执行文件是错误的,直接导致命令解析异常。
  2. 文件名参数未加引号:如果视频文件名包含空格,PowerShell会将其拆分为多个参数传递给ffmpeg,导致ffmpeg无法识别完整的输入/输出文件路径,进而生成空的.mp4文件。
  3. 字符串替换不可靠:用$_.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:12