Usando o FFmpeg via PowerShell - Uso correto de traços e aspas em argumentos

1

O StackExchange foi o primeiro lugar para eu procurar respostas por um longo tempo - infelizmente, não consegui encontrar nenhuma solução (de trabalho) para o meu problema atual, então eu abri essa pergunta.

O que estou tentando fazer é criar um PowerShell-Script (sou bem novo no PS) para processar automaticamente uma lista de arquivos (ou seja, todos os arquivos MP4 que compartilham a mesma pasta que o script) via FFmpeg.

TL; DR: O que eu não consigo trabalhar: Usando comandos de filtro ( -vf "iamafilterargument" ) que incluem variáveis.

O comando que estou tentando trabalhar quando escrito à mão no cmd seria:

ffmpeg -i <input_file> -an -c:v libx264 -crf 16 -preset veryslow -vf "drawtext=fontsize=12:fontfile=/Windows/Fonts/arial.ttf:text='<input_filename>':bordercolor=black:borderw=2:fontcolor=white:x=(w-tw)/2:y=5:alpha=0.5" <output_filename>.mkv

Via cmd, isso funciona exatamente como pretendido. Agora meu PS-Script:

$encoder = "C:\FFMPEG\ffmpeg.exe"
$dateien = Get-ChildItem .\*.mp4
$dateinamen = ForEach-Object {$dateien.BaseName}    
    for($i=0; $i -lt $dateien.Length; $i++){
        $filterbefehl = " -i " + $dateien[$i] + " -an -map_metadata -1 -vf='"drawtext=fontsize=12:fontfile=/Windows/Fonts/arial.ttf:text=" + $dateinamen[$i] + ":bordercolor=black:borderw=2:fontcolor=white:x=(w-tw)/2:y=5:alpha=0.5'" -c:v libx264 -intra -crf 16 -hide_banner " + $dateinamen[$i] + ".mkv"
        Start-Process -FilePath $encoder -ArgumentList $filterbefehl -NoNewWindow; pause
    }
    Write-Host "Done!"

No entanto, recebo esta mensagem de erro do FFmpeg: (Eu deixei o nome do arquivo intencionalmente - o arquivo inteiro é chamado "cam4_2017-03-01_2238.mp4".)

Unrecognized option 'vf=drawtext=fontsize=12:fontfile=/Windows/Fonts/arial.ttf:text=cam4_2017-03-01_2238:bordercolor=black:borderw=2:fontcolor=white:x=(w-tw)/2:y=5:alpha=0.5'. Error splitting the argument list: Option not found

Eu tentei todo tipo de coisa:

  • Usando double-doublequotes ("") em vez de backticks ('")
  • Usando &$encoder $filterbefehl
  • Incluindo o conteúdo de $ filterbefehl em -ArgumentList
  • Usando singlequotes em vez de doublequotes para $ filterbefehl

O resultado acima é o mais próximo de um script que eu consegui realizar até agora. A maioria das minhas outras tentativas falhou porque não consegui descobrir como obter as citações corretas (tanto "" quanto "" não funcionaram).

Software usado:  - Win10 Pro (embora eu gostaria que ele funcionasse em Win > = 7)  - Powershell 5.1 (Build 14393)  - FFmpeg-binariy do site da Zeranoe - última versão    (20170225-7e4f32f) (usando 3.2.2 não fez diferença)

Agradecemos antecipadamente por me ajudar!

    
por flolilolilo 02.03.2017 / 15:22

1 resposta

1

@ A resposta de Mulvya estava correta - ao corrigir -vf="<params>" para -vf "<params>" , o código funciona.

Em uma nota: Se alguém tentar trabalhar com drawtext e receber o erro Fontconfig error: Cannot load default config file do FFmpeg - Verifique se a sua pasta de trabalho não está no disco do sistema (por exemplo, D: \ Path ). Em caso afirmativo, altere seu código para algo assim:

$system_volume = "C:\"
$files_volume = "D:\Path"
cd $system_volume <ffmpeg drawtext-command as above, with FULL PATH for input and output files>
cd $files_volume <additional commands>

Obrigado novamente pela ajuda!

    
por 03.03.2017 / 21:45