Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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 файлов в пачке:
Скрытый текст

Итог обработки:
Скрытый текст
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:33, 09-08-2018 | #9