Я новичок в написании bash-скриптов. Я написал скрипт с целью исправления файлов MP4 с кодировкой HEVC, в которых отсутствует атом ctts. Он основан на этот скрипт от пользователя форума Plex. Сценарий выполняет то, что я пытаюсь сделать, но требует ручной проверки каждого файла и запуска его по сценарию. В моей библиотеке более 450 фильмов, и я хочу иметь возможность запустить сценарий один раз и не беспокоиться об этом.
Требования к моему скрипту следующие:
- Определите ВСЕ файлы MP4 с кодировкой HEVC, в которых отсутствует атом ctts
- Для каждого файла:
- Мукс из MP4 в MKV
- Мультиплексируйте видеопоток из файла MKV и аудиопоток из файла MP4 в новый файл с расширением .fixed.mp4.
- Переместите исходный файл в резервную папку на случай, если какой-либо из файлов будет поврежден.
Вот сценарий, который я написал:
#! /бин/баш
# Переменные
MEDIA_DIR="/mnt/driveA/Media/"
TMP_DIR="/mnt/дискA/tmp/"
BACKUP_DIR="/mnt/дискA/резервные копии/"
MKVMERGE_OPTS="-d 0 -A -S"
FFMPEG_OPTS="-map 1 -map 0 -map -0:v:0 -map -1:v:1 -map_metadata 0 -c copy -tag:v:0 hvc1 -movflags +faststart -f mp4"
найти $MEDIA_DIR -name "*.mp4" | при чтении ФАЙЛА;
делать
если AtomicParsley "$FILE" -T 1 | grep -q ctts
тогда
истинный
еще
BASE_FILE="$(базовое имя "${FILE}" .mp4)"
WORKING_DIR="$(имя папки "${ФАЙЛ}")/"
echo "Отсутствуют ctts: ${BASE_FILE}"
echo "Ремуксирование ${FILE} в ${TMP_DIR}${BASE_FILE}.mkv"
mkvmerge ${MKVMERGE_OPTS} -o "${TMP_DIR}${BASE_FILE}.mkv" "${FILE}"
echo "Объединение видеопотока из ${TMP_DIR}${BASE_FILE}.mkv со звуком из ${FILE}"
ffmpeg -i "${FILE}" -i "${TMP_DIR}${BASE_FILE}.mkv" ${FFMPEG_OPTS} "${WORKING_DIR}${BASE_FILE}.fixed.mp4"
echo "Перемещение ${FILE} в резервную папку"
mv -v "${ФАЙЛ}" "${BACKUP_DIR}"
фи
сделано
Идентификация файлов и их мультиплексирование из MP4 в MKV было достаточно простым, но я столкнулся с каким-то странным поведением на шаге 1.2. Единственное, как я могу это описать, это то, что скрипт пытается продолжать работать, пока ffmpeg делает свое дело.
Скрипт действительно делает то, что должен делать. Он обработает некоторые файлы (которые, как я подтвердил, были исправлены), затем будет задыхаться, пока не остановится. Чтобы продолжить обработку файлов, я должен продолжать его запускать, что сводит на нет всю цель изменения сценария с форумов plex для сканирования всей моей медиатеки.
Вот пример вывода: https://pastebin.com/6btkzAj4
Что также странно, так это то, что последний фильм, который он пытался обработать, Teaching Mrs. Tingle, НЕ является одним из затронутых файлов, и его нужно было пропустить. Когда я запускаю этот скрипт, он не включается в результаты:
#! /бин/баш
# Переменные
MEDIA_DIR="/mnt/driveA/Media/"
найти $MEDIA_DIR -name "*.mp4" | при чтении ФАЙЛА;
делать
если AtomicParsley "$FILE" -T 1 | grep -q ctts
тогда
истинный
еще
echo "Отсутствуют ctts: ${FILE}"
фи
сделано
Как заставить скрипт убедиться, что ffmpeg завершил обработку исправленного файла, прежде чем двигаться дальше?
Совершаю ли я какие-либо глупые ошибки, которые могут вызвать это?? (или есть ли более простые способы выполнить то, что я пытаюсь сделать??)
Любая помощь или обратная связь будут очень признательны.
(Я запускаю это на Ubuntu 20.04.3)