PowerShell调用ffmpeg批量转PCM为WAV脚本无响应问题排查
批量转换PCM到WAV的PowerShell脚本修复方案
原脚本未执行转换的核心问题在于直接传递FileInfo对象给ffmpeg,以及路径处理不严谨,导致ffmpeg无法正确识别输入输出文件路径。以下是修正后的脚本及关键说明:
修正后的脚本
# 获取当前目录下所有.pcm文件(包含子目录,若不需要递归可去掉-Recurse) $pcmFiles = Get-ChildItem -Filter "*.pcm" -Recurse foreach ($file in $pcmFiles) { # 生成对应的.wav文件路径(使用FullName确保完整路径) $wavPath = [System.IO.Path]::ChangeExtension($file.FullName, ".wav") # 调用ffmpeg执行转换,用引号包裹路径避免空格问题,&确保正确执行外部命令 & .\ffmpeg.exe -f s16le -ar 24000 -ac 1 -i "$($file.FullName)" "$wavPath" -y # 可选:输出转换状态 if ($LASTEXITCODE -eq 0) { Write-Host "已转换:$($file.Name) -> $(Split-Path $wavPath -Leaf)" } else { Write-Warning "转换失败:$($file.Name),ffmpeg退出码:$LASTEXITCODE" } }
关键修复点
- 路径字符串化:使用
$file.FullName替代直接传递FileInfo对象,确保ffmpeg拿到的是可识别的文件路径字符串。 - 引号包裹路径:用
"$($file.FullName)"和"$wavPath"包裹路径,避免文件名或目录名含空格时ffmpeg解析错误。 - 明确调用外部命令:用
&执行ffmpeg,比.更稳妥,避免PowerShell的脚本块解析冲突。 - 添加声道参数:新增
-ac 1(单声道),若你的PCM是双声道可改为-ac 2,缺失声道参数可能导致ffmpeg无法正确解码PCM。 - 覆盖输出文件:添加
-y参数,自动覆盖已存在的同名WAV文件,避免交互提示中断批量处理。 - 状态反馈:通过
$LASTEXITCODE检查ffmpeg执行结果,输出转换状态方便排查问题。
额外排查建议
- 确认ffmpeg.exe确实和脚本在同一目录,或者在系统PATH中;若不在同一目录,需指定ffmpeg的完整路径(如
C:\tools\ffmpeg.exe)。 - 测试单个文件转换:手动执行
.\ffmpeg.exe -f s16le -ar 24000 -ac 1 -i "test.pcm" "test.wav",确认ffmpeg能正常工作,排除参数或文件本身的问题。 - 检查PowerShell执行权限:若脚本无法运行,可先执行
Set-ExecutionPolicy RemoteSigned(以管理员身份运行PowerShell)修改执行策略。
内容的提问来源于stack exchange,提问作者Jordy
相关产品推荐
相关产品推荐

