Використання FFmpeg за допомогою PowerShell - Правильне використання тире і цитат у аргументах


1

StackExchange - це перше місце, де я довго шукав відповіді - на жаль, я не міг знайти жодного (робочого) рішення для моєї поточної проблеми, тому відкрив це питання.

Я намагаюся створити сценарій PowerShell-Script (я зовсім новачок у PS), щоб автоматично обробляти список файлів (тобто всі файли MP4, які мають спільну папку з сценарієм) через FFmpeg.

TL; DR: Що я не можу працювати: Використовуючи команди фільтрів ( -vf "iamafilterargument" ), які включають змінні.

Команда, яку я намагаюся працювати, коли написано вручну в cmd, буде:

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

Через cmd це працює так само, як і передбачалося. Тепер мій сценарій PS:

$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!"

Однак, я отримую це повідомлення про помилку від FFmpeg: (Я залишив назву файлу навмисно - весь файл називається "cam4_2017-03-01_2238.mp4".)

Нерозпізнана опція   'vf = drawtext = fontsize = 12: fontfile = / Windows / Шрифти / arial.ttf: text = cam4_2017-03-01_2238: bordercolor = black: borderw = 2: fontcolor = white: x = (w-tw) / 2: у = 5: альфа = 0,5 '.   Помилка розбиття списку аргументів: параметр не знайдено

Я спробував всілякі речі:

  • Використання подвійних подвійних лапок ("") замість зворотних (`")
  • Використання &$encoder $filterbefehl
  • Включаючи вміст $ filterbefehl в -ArgumentList
  • Використовуючи одинарні лапки замість подвійних лапок для $ filter befehl

Вищенаведений результат є найбільш наближеним до робочого сценарію, який я міг досягти дотепер. Більшість моїх інших спроб не вдалося, тому що я не міг розібратися, як отримати відповідні котирування ("" і "" не працювали).

Використане програмне забезпечення:  - Win10 Pro (хоча я б хотів, щоб він працював на Win & gt; = 7)  - Powershell 5.1 (Build 14393)  - FFmpeg-binariy з сайту Zeranoe - остання версія    (20170225-7e4f32f) (використання 3.2.2 не змінилося)

Заздалегідь спасибі за допомогу!


1
Не повинно бути = в -vf=
Gyan

На жаль, ви маєте рацію, @Mulvya - я використовував його тисячу разів, і це перший раз, коли я включив знак рівняння :-D Тепер він виводить помилку про моє fontfile - Я перевірю це пізніше. Дуже незручно - невдача через помилку новачка ;-)
flolilolilo

@flolilo Ви задали дуже детальне питання, набагато вищий за якість більшості перших постів на SU. Ви не повинні бути збентежені. Це помилка щодо fontfile шлях до шрифту?
root

Дякуємо за добрі слова, @root ;-) Помилка FFmpeg Fontconfig error: Cannot load default config file - Мені знадобилося деякий час, щоб з'ясувати, що ця помилка з'являється, якщо ваш робочий каталог не знаходиться на системному диску (наприклад, D: Path). Тому мій код зараз включає: $system_volume = "C:\" $files_volume = "D:\Path" cd $system_volume <ffmpeg command as above, with FULL PATH for input and output files> cd $files_volume <additional commands> (весь сценарій дуже довгий, оскільки це була лише одна частина всієї речі - пізніше, я об'єднав файли, ...) Ще раз спасибі за допомогу!
flolilolilo

Відповіді:


1

@ Mulvya відповів правильно - при корекції -vf="<params>" до -vf "<params>", код працює.

На виділення: Якщо хтось намагається працювати з drawtext і отримує помилку Fontconfig error: Cannot load default config file з FFmpeg - Перевірте, чи ваш робочий каталог не знаходиться на системному диску (наприклад, D: Path). Якщо так, змініть код на щось на зразок:

$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>

Ще раз спасибі за допомогу!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.