Цитата bidjo:
туда не записываются файлы все подряд, »
|
А это:
Цитата bidjo:
For /F "delims=" %%A In ('Dir "*.*" /A-D /B') Do (Echo %%~A)>>list.txt »
|
что тогда?
Цитата bidjo:
в предыдущем варианте скрипт отрабатывает 960 файлов, в папке где их уже 50 и более тысяч. он для этого нужен. а скрипт concate нужен после, того как все устаканится и не будет такой чехарды. »
|
А какая разница? Я лично не вижу никакой, что пятьдесят файлов обработать, что пятьдесят тысяч, что пятьдесят миллионов, алгоритм один и тот же.
Вот Вам код на PowerShell:
Скрытый текст
Код:

Param (
[System.String]$sSourceFolder = (Convert-Path -Path '.'),
[System.Int32]$iLimit = 100
)
if([System.IO.Directory]::Exists($sSourceFolder)) {
do {
$sFileList = [System.IO.Path]::Combine($sSourceFolder, [System.IO.Path]::GetRandomFileName())
} until(-not [System.IO.File]::Exists($sFileList))
$aFiles = Get-ChildItem -Path "$sSourceFolder\*.*" -File -Include '*.jpg', '*.jpeg', '*.jpe'
if($aFiles.Count -gt 0) {
$i = 0
foreach($oFile in $aFiles) {
Add-Member -InputObject $oFile -NotePropertyName Number -NotePropertyValue $i
$i++
}
$aFiles | Group-Object -Property { [Math]::Floor([System.Int32]$_.Number / $iLimit) } | ForEach-Object -Process {
$iListFileNumber = ([System.Int32]$_.Name) + 1
$iFilesCount = $_.Count
$_.Group | ForEach-Object -Begin {
$sContent = ''
} -Process {
$sContent += "file '$($_.Name)'`r`n"
} -End {
Out-File -InputObject $sContent -FilePath $sFileList -Encoding "Default" -NoNewline
Start-Process `
-FilePath 'C:\Program Files\FFmpeg\bin\ffmpeg.exe' `
-ArgumentList "-y -f concat -safe 0 -r 2 -i $([System.IO.Path]::GetFileName($sFileList)) -threads 2 -vcodec libx264 -preset veryfast -qp 30 -tune grain -r 1 -framerate 1 Output$($iListFileNumber.ToString("0000")).avi" `
-WorkingDirectory $sSourceFolder `
-NoNewWindow -Wait
Write-Host "$iFilesCount file(s) splitted into [Output$($iListFileNumber.ToString("0000")).avi]." -ForegroundColor Green
}
}
[System.IO.File]::Delete($sFileList)
switch($host.UI.PromptForChoice("Delete files?", "Delete all splitted jpeg files?", [System.Management.Automation.Host.ChoiceDescription[]] @("&Yes", "&No"), 1)) {
0 {
foreach($oFile in $aFiles) {
$oFile.Delete()
Write-Host "File [$($oFile.Name)] deleted."
}
Write-Host "Total $($aFiles.Count) file(s) deleted."
}
1 {
# Nothing to do
}
}
} else {
Write-Host "Can't find any jpeg files in source folder [$sSourceFolder], nothing to do." -ForegroundColor Green
}
} else {
Write-Host "Can't find source folder [$sSourceFolder]." -ForegroundColor Red
}
который использует два параметра — путь к целевому каталогу (по умолчанию — текущий каталог) и число файлов в «пачке» (по умолчанию — 100). В указанном каталоге ищутся все jpeg-файлы, группируются по заданному числу файлов в «пачке», для каждой группы имён создаётся файл, который указывается аргументом при вызове ffmpeg.exe, после отработки которого обрабатывается следующая группа файлов до их исчерпания. В конце задаётся вопрос, следует ли удалять обработанные jpeg-файлы (чтобы у Вас была возможность перед их удалением предварительно посмотреть на получившиеся avi-файлы и оценить результат).
Пример процесса обработки двадцати шести jpeg-файлов в текущем каталоге, по 10 файлов в пачке:
Итог обработки: