Використання 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.