Score:0

ผลลัพธ์ที่ไม่คาดคิดจาก ffmpeg ในสคริปต์ทุบตี

ธง ca

ฉันค่อนข้างใหม่กับการเขียนสคริปต์ทุบตี ฉันเขียนสคริปต์โดยมีเป้าหมายเพื่อแก้ไขไฟล์ MP4 ที่เข้ารหัส HEVC ที่ไม่มี ctts atom มันขึ้นอยู่กับ สคริปต์นี้ จากผู้ใช้ฟอรัม Plex สคริปต์ทำสิ่งที่ฉันพยายามทำสำเร็จ แต่ต้องตรวจสอบทุกไฟล์ด้วยตนเองและเรียกใช้กับสคริปต์ ฉันมีภาพยนตร์มากกว่า 450 เรื่องในห้องสมุดของฉัน และฉันต้องการเรียกใช้สคริปต์เพียงครั้งเดียวโดยไม่ต้องกังวลกับมัน

ข้อกำหนดสำหรับสคริปต์ของฉันมีดังนี้:

  1. ระบุไฟล์ MP4 ที่เข้ารหัส HEVC ทั้งหมดที่ไม่มี ctts atom
  2. สำหรับแต่ละไฟล์:
    1. Mux จาก MP4 เป็น MKV
    2. รวมสตรีมวิดีโอจากไฟล์ MKV และสตรีมเสียงจากไฟล์ MP4 เป็นไฟล์ใหม่ที่มีนามสกุล .fixed.mp4
    3. ย้ายไฟล์ต้นฉบับไปยังโฟลเดอร์สำรองในกรณีที่ไฟล์ใดไฟล์หนึ่งเสียหาย

นี่คือสคริปต์ที่ฉันเขียน:

#! /ถัง/ทุบตี

#ตัวแปร
MEDIA_DIR="/mnt/driveA/สื่อ/"
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"

ค้นหา $MEDIA_DIR -name "*.mp4" | ขณะอ่าน FILE;
ทำ
    ถ้า AtomicParsley "$FILE" -T 1 | grep -q ctts
        แล้ว
            จริง
        อื่น
            BASE_FILE="$(ชื่อฐาน "${FILE}" .mp4)"
            WORKING_DIR="$(ชื่อ "${FILE}")/"
            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 "${FILE}" "${BACKUP_DIR}"
    ไฟ
เสร็จแล้ว

การระบุไฟล์และ mux-ing จาก MP4 เป็น MKV นั้นง่ายพอ แต่ฉันพบพฤติกรรมแปลกๆ บางอย่างในขั้นตอนที่ 1.2 วิธีเดียวที่ฉันสามารถอธิบายได้คือสคริปต์พยายามดำเนินต่อไปในขณะที่ ffmpeg กำลังดำเนินการอยู่

สคริปต์ทำในสิ่งที่ควรทำ มันจะประมวลผลไฟล์บางไฟล์ (ซึ่งฉันยืนยันว่าได้รับการแก้ไขแล้ว) จากนั้นมันก็จะสำลักตัวเองต่อไปจนกว่าจะหยุด เพื่อที่จะประมวลผลไฟล์ต่อไป ฉันต้องเรียกใช้มันต่อไป ซึ่งขัดต่อจุดประสงค์ทั้งหมดของการแก้ไขสคริปต์จากฟอรัมเพล็กซ์เพื่อสแกนไลบรารีสื่อทั้งหมดของฉัน

นี่คือตัวอย่างผลลัพธ์: https://pastebin.com/6btkzAj4

สิ่งที่แปลกอีกอย่างคือภาพยนตร์เรื่องล่าสุดที่พยายามประมวลผลเรื่อง Teaching Mrs. Tingle ไม่ใช่ไฟล์ที่ได้รับผลกระทบและควรถูกข้ามไป เมื่อฉันเรียกใช้สคริปต์นี้ สคริปต์นี้จะไม่รวมอยู่ในผลลัพธ์:

#! /ถัง/ทุบตี

#ตัวแปร
MEDIA_DIR="/mnt/driveA/สื่อ/"

ค้นหา $MEDIA_DIR -name "*.mp4" | ขณะอ่าน FILE;
ทำ
    ถ้า AtomicParsley "$FILE" -T 1 | grep -q ctts
        แล้ว
            จริง
        อื่น
            echo "ไม่มี ctts: ${FILE}"
    ไฟ
เสร็จแล้ว

ฉันจะบังคับสคริปต์เพื่อให้แน่ใจว่า ffmpeg ประมวลผลไฟล์แก้ไขเสร็จแล้วก่อนที่จะดำเนินการต่อได้อย่างไร

ฉันทำผิดพลาดโง่ ๆ ที่จะก่อให้เกิดนี้ ?? (หรือมีวิธีที่ง่ายกว่าในการบรรลุสิ่งที่ฉันพยายามทำอยู่??)

ความช่วยเหลือหรือข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมาก

(ฉันใช้งานบน Ubuntu 20.04.3)

hr flag
ฉันไม่เข้าใจคำอธิบายของคุณจริงๆ แต่ปัญหา *อาจ* เป็นไปได้ว่า `ffmpeg` พยายามอ่านจาก stdin เดียวกันกับ while loop - ดูตัวอย่าง [เรียกใช้คำสั่ง "ffmpeg" ในลูป](https:// stackoverflow.com/questions/21634088/execute-ffmpeg-command-in-a-loop)
Clayton Egan-Wyer avatar
ca flag
ขอโทษด้วย ฉันไม่ค่อยเก่งเรื่องใส่สิ่งที่อยู่ในหัวลงในข้อความ :P ตามคำแนะนำของคุณ ฉันได้เพิ่มแฟล็ก -nostdin ให้กับ FFMPEG_OPTS และตอนนี้มันก็ทำงานตามที่คาดไว้!! ขอขอบคุณสำหรับความช่วยเหลือของคุณ!!
hr flag
ยอดเยี่ยม! เต็มใจช่วย

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา