Por que esse comando FFMPEG, quando chamado pelo Powershell, gera ruído branco?

1

Sou tentando criar um script Powershell que observe uma pasta para novos arquivos MP3 e os converta para o formato M4A usando FFMPEG e Codificador FDK AAC .

Como fdkaac.exe não aceita arquivos MP3 como entrada, eu uso este comando, que é enviado pelo ffmpeg:

ffmpeg -i $path -f caf - | fdkaac -p5 -b64 - -o $outfolder\$outname.m4a

Isso funciona muito bem se eu inseri-lo em um prompt de comando e o arquivo M4A resultante que é gerado não tem problemas.

No entanto, se eu executar isso a partir do Powershell, o arquivo M4A será criado, mas não conterá nada além de ruído branco desagradável (e traços muito fracos de música).

Uma ideia de por que isso acontece?

Aqui está o script Powershell se isso ajudar:

### 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}
    
por Vinayak 18.08.2016 / 00:13

1 resposta

1

Why does this FFMPEG command when called from Powershell generate white noise?

Resolução de problemas Mais

  • Tente testar com um arquivo de um PowerShell elevado executado como administrador e depois canalizar para o outro comando.
    • Verifique este arquivo quando for executado no PowerShell para confirmar que a execução com o PowerShell contra apenas um arquivo se tiver o mesmo efeito.

Pode ser a outra lógica ou como ela funciona, fazendo com que ela seja impressa dessa forma, então você pode precisar dividir a lógica, testar, etc. para determinar em que nível há um problema com a lógica.

Comece com

Eu começaria executando o seguinte:

  • ffmpeg -i $path -f caf - | fdkaac -p5 -b64 - -o $outfolder\$outname.m4a

mas use arquivos estáticos, caminhos, etc., em vez de ter as variáveis dinâmicas de PS, preencha essas partes dos comandos para ver se os resultados estão bem assim. Se ainda não o fez, pode ser uma maneira fácil de confirmar que é a lógica dinâmica que apenas causa o problema.

Editar por OP

Após a resolução de problemas com caminhos estáticos, verifica-se que o Powershell não canalizou a saída do FFMPEG como eu esperava.

Observando novos processos no Gerenciador de Tarefas, parecia que o Powershell estava executando cada programa sequencialmente enquanto executava o mesmo comando em um prompt de comando que mostrava fdkaac.exe e ffmpeg.exe ambos foram executados simultaneamente.

Enquanto pesquisava o comportamento, encontrei esta resposta que sugere que o redirecionamento funciona de maneira diferente no Powershell, então alterei & $command to cmd /c $command para permitir que o CMD manipule a execução do comando em vez do Powershell que resolveu o problema.

    
por 18.08.2016 / 23:22