Puncte:0

Ieșire neașteptată de la ffmpeg în scriptul bash

drapel ca

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:

  1. Identificați TOATE fișierele MP4 codificate HEVC care lipsesc atomul ctts
  2. Pentru fiecare fișier:
    1. Mux de la MP4 la MKV
    2. Mutați fluxul video din fișierul MKV și fluxul audio din fișierul MP4 într-un fișier nou cu extensia .fixed.mp4
    3. 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)

drapel hr
Nu prea înțeleg descrierea dvs., dar problema *poate* să fie că `ffmpeg` încearcă să citească din același stdin ca și bucla while - vedeți, de exemplu, [Executați comanda „ffmpeg” într-o buclă](https:// stackoverflow.com/questions/21634088/execute-ffmpeg-command-in-a-loop)
Clayton Egan-Wyer avatar
drapel ca
Îmi pare rău pentru asta, nu mă pricep să pun ce am în cap în text :P Pe baza sugestiei dvs., am adăugat indicatorul -nostdin la FFMPEG_OPTS și acum funcționează conform așteptărilor!! Vă mulţumesc pentru ajutor!!
drapel hr
Grozav! Mă bucur să fiu de ajutor

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.