Sunt destul de nou în a scrie scripturi bash. Am scris un script cu scopul de a remedia fișierele MP4 codificate HEVC cărora le lipsește atomul ctts. Se bazeaza pe acest scenariu de la un utilizator de forum Plex. Scriptul realizează ceea ce încerc să fac, dar necesită verificarea manuală a fiecărui fișier și rularea acestuia împotriva scriptului. Am peste 450 de filme în biblioteca mea și vreau să pot rula scenariul o dată și să nu trebuie să-mi fac griji.
Cerințele pentru scriptul meu sunt următoarele:
- Identificați TOATE fișierele MP4 codificate HEVC care lipsesc atomul ctts
- Pentru fiecare fișier:
- Mux de la MP4 la MKV
- Mutați fluxul video din fișierul MKV și fluxul audio din fișierul MP4 într-un fișier nou cu extensia .fixed.mp4
- Mutați fișierul original într-un folder de rezervă în cazul în care vreunul dintre fișiere este spart
Iată scenariul pe care l-am scris:
#! /bin/bash
# Variabile
MEDIA_DIR="/mnt/driveA/Media/"
TMP_DIR="/mnt/driveA/tmp/"
BACKUP_DIR="/mnt/driveA/backups/"
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"
găsiți $MEDIA_DIR -nume „*.mp4” | în timp ce citește FIȘIER;
do
dacă AtomicParsley „$FILE” -T 1 | grep -q ctts
atunci
Adevărat
altfel
BASE_FILE="$(nume de bază "${FILE}" .mp4)"
WORKING_DIR="$(dirname "${FILE}")/"
echo „Lipsesc ctts: ${BASE_FILE}”
echo „Remuxarea ${FILE} la ${TMP_DIR}${BASE_FILE}.mkv”
mkvmerge ${MKVMERGE_OPTS} -o „${TMP_DIR}${BASE_FILE}.mkv” „${FILE}”
echo „Combinarea fluxului video de la ${TMP_DIR}${BASE_FILE}.mkv cu sunetul de la ${FILE}”
ffmpeg -i „${FILE}” -i „${TMP_DIR}${BASE_FILE}.mkv” ${FFMPEG_OPTS} „${WORKING_DIR}${BASE_FILE}.fixed.mp4”
echo „Se mută ${FILE} în dosarul de rezervă”
mv -v „${FILE}” „${BACKUP_DIR}”
fi
Terminat
Identificarea fișierelor și mutarea lor de la MP4 la MKV a fost destul de simplă, dar mă confrunt cu un comportament ciudat la pasul 1.2. Singurul mod în care îl pot descrie este că scriptul încearcă să continue în timp ce ffmpeg își face treaba.
Scenariul face ceea ce ar trebui să facă, într-un fel. Va procesa unele fișiere (care am confirmat că au fost remediate), apoi se va sufoca în continuare până când se oprește. Pentru a continua procesarea fișierelor, trebuie să-l rulez în continuare - ceea ce încalcă întregul scop de a modifica scriptul de pe forumurile plex pentru a scana întreaga mea bibliotecă media.
Iată o mostră a rezultatului: https://pastebin.com/6btkzAj4
Ceea ce este, de asemenea, ciudat este ultimul film pe care a încercat să-l proceseze, Teaching Mrs. Tingle, NU este unul dintre fișierele afectate și ar fi trebuit să fie omis. Când rulez acest script, nu este inclus în rezultate:
#! /bin/bash
# Variabile
MEDIA_DIR="/mnt/driveA/Media/"
găsiți $MEDIA_DIR -nume „*.mp4” | în timp ce citește FIȘIER;
do
dacă AtomicParsley „$FILE” -T 1 | grep -q ctts
atunci
Adevărat
altfel
echo „Lipsesc ctts: ${FILE}”
fi
Terminat
Cum forțez scriptul pentru a mă asigura că ffmpeg a terminat de procesat fișierul fixat înainte de a trece mai departe?
Fac vreo greșeală stupidă care ar fi cauza asta?? (sau există modalități mai ușoare de a realiza ceea ce încerc să fac?)
Orice ajutor sau feedback va fi foarte apreciat.
(Rulez asta pe Ubuntu 20.04.3)