我是尝试创建一个监视文件夹的 Powershell 脚本新的 MP3 文件,并使用 FFMPEG 将它们转换为 M4A 格式,并FDK AAC编码器。
由于fdkaac.exe
不会将 MP3 文件作为输入,我使用这个命令,它从 ffmpeg 管道传输:
ffmpeg -i $路径-f caf-|fdkaac-p5-b64--o $outfolder\$outname.m4a
如果我将其输入到命令提示符中,这就可以正常工作,并且生成的 M4A 文件没有任何问题。
但是,如果我从 Powershell 运行它,则会创建 M4A 文件,但其中只包含令人不快的白噪声(和非常微弱的音乐痕迹)。
有什么想法可以解释为什么会这样吗?
以下是Powershell 脚本如果有帮助的话:
### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "E:\test"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$watcher.NotifyFilter = [IO.NotifyFilters]'FileName, Size'
### DEFINE ACTIONS AFTER A EVENT IS DETECTED
$action = { $path = $Event.SourceEventArgs.FullPath
$filename = $Event.SourceEventArgs.Name
$outname = [io.path]::GetFileNameWithoutExtension($path)
$outfolder = "C:\Users\Public\Music\"
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $path"
Add-content "E:\log.txt" -value $logline
If ($path -match '.mp3|.m4a') {
$command = "ffmpeg -i `"$path`" -f caf - | fdkaac -p5 -b64 - -o `"$outfolder\$outname.m4a`""
Add-content "E:\log.txt" -value "[Transcode] $filename"
& command
}
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY
$created = Register-ObjectEvent $watcher "Created" -Action $action
while ($true) {sleep 5}
答案1
为什么从 Powershell 调用此 FFMPEG 命令时会产生白噪声?
更多故障排除
- 尝试使用以管理员身份运行的提升的 PowerShell 中的一个文件进行测试,然后将其通过管道传输到另一个命令。
- 从 PowerShell 运行时检查此文件,以确认使用 PowerShell 针对一个文件运行它是否具有相同的效果。
可能是其他逻辑或其工作方式导致它以这种方式输出,因此您可能需要分解逻辑、进行测试等,以确定逻辑在哪个级别存在问题。
从...开始
我将首先运行以下命令:
ffmpeg -i $path -f caf - | fdkaac -p5 -b64 - -o $outfolder\$outname.m4a
但使用静态文件、路径等,而不是让 PS 中的动态变量填充命令的这些部分,以此方式查看结果是否正确。如果您还没有这样做,这可能是确认动态逻辑是否只导致问题的简单方法。
由 OP 编辑
在使用静态路径进行故障排除后,事实证明 Powershell 并没有像我希望的那样传输 FFMPEG 的输出。
在任务管理器中观察新进程,Powershell 似乎正在按顺序执行每个程序,而在命令提示符中运行相同的命令则显示卸载程序和执行文件同时运行。
当我在谷歌上搜索这种行为时,我发现这个答案这表明重定向在 Powershell 中的工作方式不同,因此我改为& $command
让cmd /c $command
CMD 而不是 Powershell 来处理命令的执行,从而解决了这个问题。