Điểm:0

Đầu ra không mong muốn từ ffmpeg trong tập lệnh bash

lá cờ ca

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:

  1. Xác định TẤT CẢ các tệp MP4 được mã hóa HEVC thiếu nguyên tử ctts
  2. Đối với mỗi tệp:
    1. Chuyển từ MP4 sang MKV
    2. 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
    3. 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)

lá cờ hr
Tôi thực sự không hiểu mô tả của bạn nhưng vấn đề *có thể* là `ffmpeg` đang cố đọc từ cùng một stdin với vòng lặp while - xem ví dụ [Thực thi lệnh "ffmpeg" trong một vòng lặp](https:// stackoverflow.com/questions/21634088/execute-ffmpeg-command-in-a-loop)
Clayton Egan-Wyer avatar
lá cờ ca
Xin lỗi về điều đó, tôi không giỏi trong việc đưa những gì trong đầu vào văn bản: P Dựa trên đề xuất của bạn, tôi đã thêm cờ -nostdin vào FFMPEG_OPTS và nó hiện đang hoạt động như mong đợi!! Cảm ơn sự giúp đỡ của bạn!!
lá cờ hr
Tuyệt quá! vui vẻ giúp đỡ

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.