#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"