ฉันค่อนข้างใหม่กับการเขียนสคริปต์ทุบตี ฉันเขียนสคริปต์โดยมีเป้าหมายเพื่อแก้ไขไฟล์ MP4 ที่เข้ารหัส HEVC ที่ไม่มี ctts atom มันขึ้นอยู่กับ สคริปต์นี้ จากผู้ใช้ฟอรัม Plex สคริปต์ทำสิ่งที่ฉันพยายามทำสำเร็จ แต่ต้องตรวจสอบทุกไฟล์ด้วยตนเองและเรียกใช้กับสคริปต์ ฉันมีภาพยนตร์มากกว่า 450 เรื่องในห้องสมุดของฉัน และฉันต้องการเรียกใช้สคริปต์เพียงครั้งเดียวโดยไม่ต้องกังวลกับมัน
ข้อกำหนดสำหรับสคริปต์ของฉันมีดังนี้:
- ระบุไฟล์ MP4 ที่เข้ารหัส HEVC ทั้งหมดที่ไม่มี ctts atom
- สำหรับแต่ละไฟล์:
- Mux จาก MP4 เป็น MKV
- รวมสตรีมวิดีโอจากไฟล์ MKV และสตรีมเสียงจากไฟล์ MP4 เป็นไฟล์ใหม่ที่มีนามสกุล .fixed.mp4
- ย้ายไฟล์ต้นฉบับไปยังโฟลเดอร์สำรองในกรณีที่ไฟล์ใดไฟล์หนึ่งเสียหาย
นี่คือสคริปต์ที่ฉันเขียน:
#! /ถัง/ทุบตี
#ตัวแปร
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)