2013-02-24 14 views
6

Tôi đang cố gắng để tự động FFmpeg để remux tất cả các tập tin video trong một thư mục nhất định để MKV. Tôi hiện đang sử dụngRemux to MKV nhưng thêm tất cả các dòng bằng cách sử dụng FFmpeg

ffmpeg -i $INPUT -c copy $OUTPUT.mkv 

Tuy nhiên, một số luồng bị bỏ qua theo cách đó - ví dụ: nếu chỉ có 2 luồng âm thanh đi vào tệp đầu ra.

Làm cách nào để chỉ định rằng tất cả các luồng từ đầu vào phải được sao chép vào đầu ra?

Vì tôi đang cố gắng tự động hóa FFmpeg, sẽ tốt nhất nếu lệnh không thay đổi cho mỗi tệp, tức là xác định thủ công tất cả các luồng với -map sẽ yêu cầu tôi phân tích cú pháp mọi tệp. Tôi sẽ làm điều này nếu tôi cần, nhưng nếu có một giải pháp tốt hơn tôi thích điều đó.

+0

Theo thỏa thuận về [thảo luận Meta của riêng bạn] (http://meta.stackexchange.com/q/168740/159624), câu hỏi này sẽ được chuyển đến Người dùng cấp cao. Tôi đã bỏ phiếu để di chuyển. – slhck

+0

Từ http://meta.stackexchange.com/a/168743/170007 - * Phát triển các ứng dụng bằng cách sử dụng FFmpeg.exe và viết kịch bản để tự động hóa việc sử dụng → chủ đề cho cả hai, nhưng nhiều chủ đề hơn cho SU *. Tôi đang cố gắng để tự động hóa ffmpeg, do đó, nó ontopic ở đây, phải không? Oh, và cảm ơn câu trả lời :) – sashoalm

+0

Như bạn thích — Tôi nghĩ rằng đó là đường biên giới vì không có ngôn ngữ lập trình có liên quan, và nếu đó là '$ INPUT' hoặc' input.mp4' không tạo sự khác biệt thực sự. Nó chỉ là tôi đã nhìn thấy nhiều người trong số những câu hỏi đóng cửa ở đây vì những lý do sai, vì vậy thay vì họ di cư trước khi họ kết thúc được xóa tại một số điểm :) Bạn đang chào đón. – slhck

Trả lời

15

Làm cách nào để chỉ định rằng tất cả các luồng từ đầu vào phải được sao chép vào đầu ra?

Tùy chọn -map có thể thực hiện việc này, bằng phím tắt -map 0.

Ví dụ:

ffmpeg -i input.mkv -c copy -map 0:0 -map 0:2 output.mkv 

để sao chép các dòng 0: 0 và 0: 2 đến output.mkv.

ffmpeg -i input.mkv -c copy -map 0 output.mkv 

để sao chép tất cả đầu vào suối từ đầu vào 0 (input.mkv) đến đầu ra (thậm chí nếu có nhiều video, âm thanh hoặc dòng phụ đề).

Giá trị -map tương ứng với số lượng đầu vào (0 là đầu vào đầu tiên, 1 là đầu vào thứ hai, vv): Nếu bạn thêm một đầu vào bổ sung (-> đầu vào 1), và cũng có thể muốn sao chép toàn bộ nội dung , sau đó bạn sẽ cần phải thêm -map 1.

Bạn có thể sử dụng ffprobe để phân tích tệp và xem luồng nào được ánh xạ ở đâu. Hãy thử -fflags +genpts nếu bạn gặp lỗi unknown timestamp. Để có hướng dẫn chi tiết, xem the FFmpeg Wiki page on the -map option.

+5

Và nếu bạn gặp lỗi 'Không thể ghi gói với dấu thời gian không xác định', bạn phải thêm '-fflags + genpts' sau lệnh ffmpeg. Xem [lỗi này] (https://trac.ffmpeg.org/ticket/1979) và cách giải quyết được đề cập ở đây http://askubuntu.com/a/413968/135671 – erik

+0

Trong trường hợp bất kỳ ai tìm thấy câu trả lời này nhưng không thể tìm thấy 'ffmpeg'; 'ffmpeg' không còn tồn tại trong kho lưu trữ Ubuntu 14.04, nhưng nĩa' avconv' của nó không giống nhau ('sudo apt-get install libav-tools'). – JeroenHoek

+0

@JeroenHoek Ngoài ra, các bản dựng ffmpeg có thể được tải xuống từ http://ffmpeg.org/download.html – slhck