1

Я пытаюсь создать скрипт Powershell, который просматривает папку для новых файлов MP3 и конвертирует их в формат M4A с использованием кодера FFMPEG и FDK AAC.

Поскольку fdkaac.exe не будет принимать файлы MP3 в качестве входных данных, я использую эту команду, которая передает из ffmpeg:

ffmpeg -i $path -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 ответ1

1

Почему эта команда FFMPEG при вызове из Powershell генерирует белый шум?

Устранение неисправностей Подробнее

  • Попробуйте протестировать один файл из PowerShell с повышенными правами, который запускается от имени администратора, а затем передайте его другой команде.
    • Отметьте этот файл при запуске из PowerShell, чтобы убедиться, что при запуске его с PowerShell используется только один файл, если он имеет тот же эффект.

Это может быть другая логика или то, как она работает, заставляет ее выводить таким образом, поэтому вам может потребоваться разбить ее логику, протестировать и т.д., Чтобы определить, на каком уровне есть проблема с логикой.


Начать с

Я бы начал с запуска ниже:

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

но используйте статические файлы, пути и т. д. вместо того, чтобы динамические переменные из PS заполняли эти части команд, чтобы увидеть, хороши ли результаты таким образом. Если вы еще этого не сделали, это может быть простым способом подтвердить, что именно динамическая логика вызывает только проблему.

Редактировать с помощью OP

После устранения неполадок со статическими путями выясняется, что Powershell не передавал выходные данные FFMPEG, как я надеялся.

Наблюдая за новыми процессами в диспетчере задач, казалось, что Powershell последовательно выполняет каждую программу, а выполнение одной и той же команды в командной строке показало, что fdkaac.exe и ffmpeg.exe выполнялись одновременно.

Погугляя поведение, я нашел ответ, который предполагает, что перенаправление работает по-другому в Powershell, поэтому я изменил & $command на cmd /c $command чтобы позволить CMD обрабатывать выполнение команды вместо Powershell, что решило проблему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .