Рейтинг:0

Неожиданный вывод из ffmpeg в скрипте bash

флаг ca

Я новичок в написании bash-скриптов. Я написал скрипт с целью исправления файлов MP4 с кодировкой HEVC, в которых отсутствует атом ctts. Он основан на этот скрипт от пользователя форума Plex. Сценарий выполняет то, что я пытаюсь сделать, но требует ручной проверки каждого файла и запуска его по сценарию. В моей библиотеке более 450 фильмов, и я хочу иметь возможность запустить сценарий один раз и не беспокоиться об этом.

Требования к моему скрипту следующие:

  1. Определите ВСЕ файлы MP4 с кодировкой HEVC, в которых отсутствует атом ctts
  2. Для каждого файла:
    1. Мукс из MP4 в MKV
    2. Мультиплексируйте видеопоток из файла MKV и аудиопоток из файла MP4 в новый файл с расширением .fixed.mp4.
    3. Переместите исходный файл в резервную папку на случай, если какой-либо из файлов будет поврежден.

Вот сценарий, который я написал:

#! /бин/баш

# Переменные
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)

флаг hr
Я не совсем понимаю ваше описание, но проблема *может* заключаться в том, что `ffmpeg` пытается читать из того же стандартного ввода, что и цикл while - см., Например, [Выполнить команду "ffmpeg" в цикле](https:// stackoverflow.com/questions/21634088/execute-ffmpeg-команда-в-цикле)
Clayton Egan-Wyer avatar
флаг ca
Извините за это, я не силен в том, чтобы помещать то, что у меня в голове, в текст: P Основываясь на вашем предложении, я добавил флаг -nostdin в FFMPEG_OPTS, и теперь он работает, как и ожидалось! Спасибо за помощь!!
флаг hr
Большой! Рад был помочь

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.