Tôi còn khá mới để viết các tập lệnh bash. Tôi đã viết một tập lệnh với mục tiêu sửa các tệp MP4 được mã hóa HEVC bị thiếu nguyên tử ctts. Dựa theo kịch bản này từ một người dùng diễn đàn Plex. Tập lệnh hoàn thành những gì tôi đang cố gắng thực hiện, nhưng yêu cầu kiểm tra mọi tệp theo cách thủ công và chạy nó dựa trên tập lệnh. Tôi có hơn 450 bộ phim trong thư viện của mình và tôi muốn có thể chạy kịch bản một lần mà không phải lo lắng về nó.
Các yêu cầu cho kịch bản của tôi như sau:
- Xác định TẤT CẢ các tệp MP4 được mã hóa HEVC thiếu nguyên tử ctts
- Đối với mỗi tệp:
- Chuyển từ MP4 sang MKV
- Chuyển đổi luồng video từ tệp MKV và luồng âm thanh từ tệp MP4 thành một tệp mới có phần mở rộng .fixed.mp4
- Di chuyển tệp gốc vào thư mục sao lưu trong trường hợp bất kỳ tệp nào bị hỏng
Đây là kịch bản mà tôi đã viết:
#! /bin/bash
# Biến
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"
tìm $MEDIA_DIR -name "*.mp4" | trong khi đọc TẬP TIN;
làm
nếu AtomicParsley "$FILE" -T 1 | grep -q ctts
sau đó
thật
khác
BASE_FILE="$(tên cơ sở "${FILE}" .mp4)"
WORKING_DIR="$(tên thư mục "${FILE}")/"
echo "Thiếu ctts: ${BASE_FILE}"
echo "Đang chuyển ${FILE} sang ${TMP_DIR}${BASE_FILE}.mkv"
mkvmerge ${MKVMERGE_OPTS} -o "${TMP_DIR}${BASE_FILE}.mkv" "${FILE}"
echo "Kết hợp luồng video từ ${TMP_DIR}${BASE_FILE}.mkv với âm thanh từ ${FILE}"
ffmpeg -i "${FILE}" -i "${TMP_DIR}${BASE_FILE}.mkv" ${FFMPEG_OPTS} "${WORKING_DIR}${BASE_FILE}.fixed.mp4"
echo "Đang di chuyển ${FILE} vào thư mục sao lưu"
mv -v "${FILE}" "${BACKUP_DIR}"
fi
xong
Việc xác định các tệp và trộn chúng từ MP4 sang MKV khá đơn giản, nhưng tôi gặp phải một số hành vi lạ ở bước 1.2. Cách duy nhất tôi có thể mô tả là tập lệnh cố gắng tiếp tục trong khi ffmpeg đang thực hiện.
Kịch bản làm những gì nó phải làm, đại loại như vậy. Nó sẽ xử lý một số tệp (mà tôi xác nhận là đã được sửa), sau đó nó sẽ tự tắt cho đến khi dừng lại. Để tiếp tục xử lý các tệp, tôi phải tiếp tục chạy nó - điều này đánh bại toàn bộ mục đích sửa đổi tập lệnh từ diễn đàn plex để quét toàn bộ thư viện phương tiện của tôi.
Đây là một mẫu của đầu ra: https://Pastebin.com/6btkzAj4
Điều kỳ lạ nữa là bộ phim cuối cùng mà nó cố xử lý, Dạy bà Tingle, KHÔNG phải là một trong những tệp bị ảnh hưởng và đáng lẽ phải bị bỏ qua. Khi tôi chạy tập lệnh này, nó không được đưa vào kết quả:
#! /bin/bash
# Biến
MEDIA_DIR="/mnt/driveA/Media/"
tìm $MEDIA_DIR -name "*.mp4" | trong khi đọc TẬP TIN;
làm
nếu AtomicParsley "$FILE" -T 1 | grep -q ctts
sau đó
thật
khác
echo "Thiếu ctts: ${FILE}"
fi
xong
Làm cách nào để buộc tập lệnh đảm bảo rằng ffmpeg đã xử lý xong tệp cố định trước khi tiếp tục?
Tôi có phạm bất kỳ sai lầm ngu ngốc nào có thể gây ra điều này không ?? (hoặc có cách nào dễ dàng hơn để thực hiện những gì tôi đang cố gắng thực hiện không??)
Bất kỳ trợ giúp hoặc thông tin phản hồi sẽ được đánh giá rất cao.
(Tôi đang chạy cái này trên Ubuntu 20.04.3)