Batch trích xuất âm thanh với avconv mà không cần chuyển mã


14

Tôi có khoảng 70 tệp mp4 và tôi muốn trích xuất các tệp âm thanh trực tiếp mà không cần chuyển mã thêm. Tất cả các tập tin mp4 có tập tin âm thanh aac.

Tôi hiểu rằng tôi có thể sử dụng lệnh sau để trích xuất tệp âm thanh từ một trong các tệp mp4:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

Làm cách nào để trích xuất tất cả các tệp âm thanh từ tất cả 70 tệp mp4, vì vậy tôi kết thúc với 70 tệp aac?

Câu trả lời:


21

Bạn có thể sử dụng một vòng lặp đơn giản:

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

hoặc trên một dòng:

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

Những gì hiện được chạy avconvmột lần cho mỗi tệp có tên như *.mp4nơi tên tệp được lưu trữ trong ${i}biến.

${i%.mp4}có nghĩa là ${i}(tức là tên tệp) .mp4bị loại bỏ từ cuối.


2
IIRC, các tệp aac thô không thể chứa siêu dữ liệu; nếu bạn muốn giữ siêu dữ liệu từ các tệp gốc thì hãy sử dụng m4a (tên gọi khác của mp4, nhưng được người chơi âm thanh nhận ra khá rộng rãi) thay vì aac như một phần mở rộng tệp.
evilsoup

Tùy chọn -map để làm gì? Tại sao bạn chọn luồng 0: 1 chứ không phải các luồng khác, chẳng hạn như 0: 0, 0: 2?
qed

Tôi đã bỏ tùy chọn -map và nó hoạt động tốt
qed

để sử dụng lệnh này trong các hành động tùy chỉnh của Thunar và tương tự, nó hoạt động nếu được thêm vào tập lệnh và trong các hành động của Thunar: bash /path/to/the/script %F- như ở đây

2
@qed: việc thả -mapvẫn có thể khiến video bị xem xét khi bạn chuyển sang định dạng đầu ra khác (nếu định dạng đó có thể chứa cả âm thanh và video). An toàn hơn là giữ nguyên trạng.
dr. Sybren

5

Câu trả lời của Xiao thường hữu ích nhất nếu bạn có tất cả các tệp trong một thư mục; nhưng nếu có các tệp MP4 nằm rải rác trong các thư mục khác nhau, bạn có thể sử dụng findlệnh này để chuyển đổi tất cả.

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

Điều này sử dụng một hình thức thay thế chuỗi bash hơi khác ở cuối: "$ {0 /% mp4 / m4a}" cho bash thay thế mp4 bằng m4a, nhưng chỉ khi mp4 ở cuối chuỗi.


Tôi không bao giờ biết rằng bash có loại thay thế. Tuyệt vời :)
Andrew Gunnerson

1
@xiao Nếu bạn bỏ qua %, nó sẽ thay thế cho phiên bản đầu tiên của chuỗi mà nó tìm thấy; bạn cũng có thể sử dụng #để làm cho nó chỉ thay thế chuỗi nếu nó ở đầu một biến; vì vậy $ {0 / mp4 / m4a} sẽ thay thế phiên bản đầu tiên của mp4 bằng m4a (có thể là một vấn đề nếu bạn có tên tệp thực sự kỳ lạ); và $ {0 / # mp4 / m4a} sẽ thay thế mp4 cho m4a, nhưng chỉ khi giá trị chuỗi của biến bắt đầu bằng mp4 (rõ ràng là không sử dụng ở đây, nhưng nó có thể có ích ở nơi khác).
evilsoup

3

Để tránh nhiều tệp được xử lý cùng một lúc (có thể sử dụng quá nhiều tài nguyên), hãy sử dụng parallel. Theo mặc định, nó chỉ thực hiện một công việc tại một thời điểm. Nếu bạn muốn sử dụng song song nhiều lõi CPU, hãy thử song song parallel -j 4 ...4 công việc. Ngoài ra kiểm tra man parallel.

sudo apt-get install parallel

Dòng này sẽ trích xuất aaccác tệp âm thanh từ các video được chọn và đưa chúng vào m4acác thùng chứa.

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

Khi làm việc thẳng trong CLI, hãy thay thế %Fbằng danh sách các tệp đầu vào của bạn. Ví dụ *.mp4.

Lấy cảm hứng từ câu trả lời này , bởi một câu trả lời trước cho câu hỏi này và bởi nhận xét của evilsoup cho câu hỏi sau (nói: 'các tệp aac thô không thể chứa siêu dữ liệu; nếu bạn muốn giữ siêu dữ liệu từ các tệp gốc thì hãy sử dụng m4a (mà chỉ là một tên gọi khác của mp4, nhưng được người chơi âm thanh nhận ra khá rộng rãi) thay vì aac như một phần mở rộng tập tin ' ).

Tôi sử dụng các lệnh như vậy trong các hành động tùy chỉnh Thunar,

nhập mô tả hình ảnh ở đây

giới hạn ứng dụng cho các video có chứa aacâm thanh.

nhập mô tả hình ảnh ở đây

Để mở cửa sổ terminal trong quá trình xử lý, đóng ở cuối, lệnh có thể được thay đổi như sau:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"

2

Tôi đã mở rộng câu trả lời của @ Xiao-Long Chen, biến nó thành một tập lệnh bỏ qua các tệp khi tệp đầu ra mới hơn:

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.