Как автоматически удалить черные полосы, используя ffmpeg из скрипта Powershell? - PullRequest
0 голосов
/ 07 апреля 2020

Благодаря помощи пользователя mklement0 Я получил этот скрипт для автоматического преобразования всех файлов в папке "video_old" и перемещения их в "video_new", сохраняя при этом исходное имя файла. Исходное сообщение.

Теперь я хочу удалить черные полосы в контейнере. Я знаю, что есть «cropdetect», но AFAIK вы должны вручную проанализировать значение в сценарии. Какой параметр я должен добавить к выполнению ниже ffmpeg?

Get-ChildItem .\video_old -Filter *.mkv | ForEach-Object {
  .\ffmpeg.exe -i $_.FullName -c:v libx265 -crf 18 ".\video_new\$($_.Name)"
}

Параметры, используемые для удаления баров

ffmpeg -ss 90 -i input.mkv -vframes 10 -vf cropdetect -f null -
...
[Parsed_cropdetect_0 @ 0x220cdc0] x1:0 x2:1279 y1:0 y2:719 w:1280 h:720 x:0 y:0 pts:215 t:0.215000 crop=1280:720:0:0
[Parsed_cropdetect_0 @ 0x220cdc0] x1:0 x2:1279 y1:0 y2:719 w:1280 h:720 x:0 y:0 pts:257 t:0.257000 crop=1280:720:0:0
[Parsed_cropdetect_0 @ 0x220cdc0] x1:0 x2:1279 y1:0 y2:719 w:1280 h:720 x:0 y:0 pts:299 t:0.299000 crop=1280:720:0:0

В этом примере мы можем применить фильтр следующим образом:

ffmpeg -i input.mkv -vf crop=1280:720:0:0 -c:a copy output.mkv

OriginalPost

Снимок экрана

Example screenshot from one of the files

1 Ответ

3 голосов
/ 09 апреля 2020

Теперь, когда я понял, попробуйте это:

Get-ChildItem .\video_old -Filter *.mkv | ForEach-Object {
    $exportPath=".\video_new\$($_.Name)"
    #Export
    .\ffmpeg.exe -i $_.FullName -c:v libx265 -crf 18 $exportPath
    Write-Host "Exported file on $exportPath."
    #Know where to cut
    $results = .\ffmpeg.exe -ss 90 -i $exportPath -vframes 10 -vf cropdetect -f null - 2>&1
    #Cut
    if(($results | ? {$_ -match 'crop=\d{1,4}:\d[0-9]{1,4}:\d:\d'})){
        Write-Host "The regular expression was matched, value $($Matches[0])."
        .\ffmpeg.exe -i $exportPath -vf ($Matches[0]) -c:a copy ($exportPath.Replace($_.BaseName,"$($_.BaseName)_CUT"))
    }else{
        Write-Host "The regular expression was NOT matched. The line was '$($resultsParsed[0])'"
        $results | Out-File .\resultsFromCropDetect.txt
    }
}

У меня нет способа проверить это, но в основном я запускаю первую команду, которая говорит мне, где вырезать, с помощью регулярного выражения Я вытаскиваю только эту часть, а затем выполняю фактический раскрой, экспортируя в новый файл с именем «OriginalName_CUT.mkv».

Дайте мне знать, как с удовольствием делать изменения.

РЕДАКТИРОВАТЬ

После долгих попыток я запросил вывод ffmpeg cropdetect и отладил локально, упростив процесс поиска совпадения к cropdetect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...