2012-12-21 42 views
8

Tôi có một kịch bản bash mà tôi tạo ra để xử lý video từ bên trong một thư mục và nó là thư mục con:Bash trong khi vòng lặp chờ đợi cho đến khi nhiệm vụ đã hoàn thành

find . -type f -name '*.mkv' | while read file; 
do 
    ffmpeg -i $file ... 
done 

Vấn đề: Thay vì vòng lặp trong khi chờ đợi ffmpeg để hoàn thành, nó tiếp tục lặp qua vòng lặp. Kết quả cuối cùng là, các tệp không được xử lý. Tôi cần một cách để có vòng lặp hiện tại trong khi lặp lại để chờ đợi cho đến khi ffmpeg được hoàn thành trước khi tiếp tục tiếp theo. Hoặc cách khác để xếp hàng các mục này.

Chỉnh sửa: Vì vậy, giải pháp khi lặp qua tập hợp tệp là chuyển thông số -nostdin thành ffmpeg. Hy vọng điều này sẽ giúp bất cứ ai khác có thể có vấn đề tương tự.

Cũng có tệp -> $ tệp là lỗi đánh máy/dán.

+0

Có thể dán quá trình trong nền bằng cách sử dụng '&' ở cuối lệnh 'ffmpeg'? – squiguy

+0

Những gì bạn phải đợi cho ffmpeg kết thúc. Bạn có chắc là bạn không nhận được lỗi từ ffmpeg (như tham số không hợp lệ) không? – Mat

+3

Vòng lặp như bạn có nó sẽ đợi cho đến khi mỗi lệnh bên trong chạy, trừ khi bạn đã đặt một '&' ở cuối dòng. Bạn có nhận được thông báo lỗi nào không? Hãy thử mở đầu lệnh bên trong bằng "echo" và thêm một giấc ngủ 1 sau khi nó, để xác minh rằng bản thân vòng lặp không có vấn đề. Ví dụ, trong dòng lệnh bạn đưa ra, bạn đang sử dụng 'file' thay vì' $ file' – user295691

Trả lời

3

Tôi nhận ra tôi đăng này một thời gian trước, nhưng tôi tìm thấy giải pháp. Cảm ơn tất cả các câu trả lời. Cung cấp tham số -nostdin cho ffmpeg sẽ thực hiện thủ thuật. Nó sẽ chỉ xử lý tệp hiện tại trước khi chuyển sang tệp tiếp theo để xử lý.

tùy chọn -nostdin của ffmpeg tránh cố đọc đầu vào của người dùng từ stdin nếu không thì chính tệp video đó sẽ được diễn giải.

ffmpeg -i <filename> ... -nostdin 

Phần tốt nhất về việc sử dụng trên là bạn có thể tiếp tục sử dụng cách rườm rà trong trường hợp một lỗi được ném vào đầu ra:

ffmpeg -i <filename> ... -nostdin -loglevel panic 

HOẶC nếu bạn thà báo cáo đầu ra vào một tập tin làm như vậy theo cách này:

# Custom log name (optional). Helpful when multiple files are involved. 
# FFREPORT=./${filename}-$(date +%h.%m.%s).log 
ffmpeg -i <filename> ... -nostdin -report 

Bạn cũng có thể sử dụng kết hợp cả hai. Cũng nhờ @Barmar cho giải pháp!

3

Tôi nghĩ rằng điều này đơn giản như bạn thiếu $ trước file.

find . -type f -name '*.mkv' | while read file; 
do 
    ffmpeg -i $file ... 
done 
3

Điều này phù hợp với bạn?

find . -type f -name '*.mkv' -exec ffmpeg -i {} \; 
2

Tôi là người điều khiển câu trả lời độc ác. Tôi tìm thấy một:

ffmpeg -i $file & 
wait $! 

Nhờ Puchu, ở đây: apply ffmpeg to many files

+0

Đây là một cách tiếp cận thú vị tôi sẽ phải thử điều này. Cảm ơn! Tôi thấy rằng việc cung cấp thông số ffmpeg param -nostdin thực hiện thủ thuật. – mac2017

Các vấn đề liên quan