FFMPEG принудительно объединяет, чтобы пропустить поврежденные файлы

#batch-file #ffmpeg #concat

#пакетный файл #ffmpeg #concat

Вопрос:

В настоящее время я использую:

 ffmpeg -safe 0 -f concat -i clipstomerge.txt -vcodec copy -acodec copy mergedclips.mp4
  

Это объединяет видео из заданного каталога, указанного в clipstomerge.txt . Я заметил, что при наличии поврежденного файла concat завершится ошибкой.

Как я могу принудительно использовать concat для пропуска поврежденных файлов?

Заранее спасибо.

РЕДАКТИРОВАТЬ: я попытался перейти по этой ссылке: http://www.ffmpeg-archive.org/Force-concat-to-ignore-corrupt-files-td4664775.html
Но я не мог понять, как поместить его в мой bat-файл. Любая помощь будет с благодарностью.

Комментарии:

1. Запустите ffprobe corrupt.mp4 и предоставьте доступ к данным консоли.

2. Как насчет объединения одного клипа за другим в for цикле ?

3. @Gyan У меня сейчас нет поврежденного клипа в качестве примера, но когда я получу его, я смогу его протестировать. Нет ли простого способа обрезать файлы размером менее 1 байта или что-нибудь еще?

4. @aschipfl Они должны быть объединены с использованием файла txt, поскольку он объединяет их в определенном порядке

5. Текстовый файл мог быть прочитан for /F , поэтому порядок был сохранен…

Ответ №1:

 @echo off
setlocal

call :validateConcatFile clipstomerge.txt 2048
if errorlevel 1 echo Failed.amp; exit /b 1

echo Passed.
exit /b

:validateConcatFile  concatFile  acceptableSize
if "%~1" == "" exit /b 2
if "%~2" == "" exit /b 2

rem Check each listed media file.
for /f "usebackq tokens=1,2 delims='" %%A in ("%~1") do (

    rem Check only if leading concat keyword is "file".
    if "%%~A" == "file " (

        rem The file needs to exist.
        if not exist "%%~B" (
            echo "%%~B" not exist.
            exit /b 1
        )

        rem Check byte size.
        for %%C in ("%%~B") do if %%~zC lss %~2 (
            echo "%%~B" size is %%~zC which is less than %~2.
            exit /b 1
        ) else echo "%%~B" size is %%~zC which is ok at %~2.

        rem FFprobe scan.
        ffprobe -i "%~1" > nul 2> nul || (
            echo FFprobe set errorlevel with "%%~B".
            exit /b 1
        )
    )
)
exit /b 0
  

Код охватывает некоторые основные идеи проблемы поврежденных файлов.
Поскольку проблемы могут варьироваться в зависимости от многих концепций обнаружения повреждения,
вы можете рассматривать это как начало, поскольку
со временем любой пользователь может расширить код с помощью дополнительных концепций обнаружения.

Специальные символы, используемые в качестве экранирующих символов и т. Д., Могут привести к обнаружению отсутствия файла. Обработка этих символов сложна, поэтому недоступна в этом коде и будет возвращена настройкой errorlevel .

Другие обнаружения выполнены:

  • exist Для передачи необходимо объединить перечисленные файлы.
  • Для передачи перечисленные файлы должны иметь по крайней мере определенный размер в байтах.
  • Для прохождения перечисленных файлов необходимо пройти простую проверку ffprobe.

В примере кода первым аргументом вызываемой метки :validateConcatFile является файл concat, который является, clipstomerge.txt а 2-й аргумент 2048 — это размер в байтах, который допустим для передачи.

Ответ №2:

основываясь на ответе @michael_heath, я разработал простой if / else для оболочки на случай, если кому-то интересно:

p.s: переменная minsize указана в байтах

 SOURCE=/path/folder/
MINSIZE=10000

for f in "$SOURCE"*.mp4; do ffprobe -i $f 2> /dev/null
if [ $? -eq 0 ]
    then
    if [ $(du -s $f | cut -f1) -ge $MINSIZE ]
        then
        echo "SUCCESS - $f"
    else
        echo "SIZE ERROR - $f"
    fi
else
    echo "FFPROBE ERROR - $f"