Thay vì sử dụng -ss
và -to
tìm kiếm các tham số, có vẻ không chính xác lắm, tôi có thể cắt video cho số khung đã cho không? Ví dụ;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
[Khung thứ 80 và khung thứ 560 đi kèm. Vì vậy, tổng cộng nó tạo ra (560 - 80 +1) khung]
Sau khi trả lời và tìm kiếm một chút, tôi đã thử một số lệnh. Nhưng cho đến nay tôi không thể tìm thấy một cách chấp nhận được.
Nếu ai đó muốn cắt luồng video giữa khung hình thứ 250 và 750, đây là cách để đi. Nó sẽ cho 501 khung làm đầu ra:
Lưu ý: movie.mp4 có 25 khung hình / giây và tốc độ mẫu âm thanh 48k
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
Đúng như dự đoán, đầu ra dài 20 giây, chính xác.
Sử dụng cùng một phương pháp cho âm thanh:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
Thật bất ngờ, cái này có độ chính xác rất kém. Nó sẽ cung cấp cho tôi các mẫu 960001 (960k + 1) bằng âm thanh 20 giây. Nhưng thay vào đó, đầu ra dài 20,50 giây và có 984240 mẫu. Ngoài ra, nếu tôi tăng thời lượng, lỗi cũng tăng theo.
Sau đó, tôi đã cố gắng sử dụng tham số -ss -to để cắt luồng âm thanh:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
Cách cổ điển cũ hoạt động tốt hơn nhiều. Đầu ra dài 20,003 giây và có 960144 mẫu. Thêm vào đó, tăng thời lượng không làm tăng lỗi, sai số không đổi, luôn có 144 mẫu dư với tệp đầu vào đó.
Tóm tắt:
select
bộ lọc hoạt động tốt hầu hết thời gian nhưng một lựa chọn thì không. Các -ss
thông số cổ điển hoạt động tốt hơn cho âm thanh nhưng không chính xác mẫu. Ngoài ra, không thể sử dụng -vf select
và -ss
tham số cùng nhau, vì -ss
sẽ ảnh hưởng đến cả luồng âm thanh và video trong khi chúng tôi muốn nó chỉ ảnh hưởng đến âm thanh.
Vì vậy, để cắt chính xác một tệp phương tiện, tôi phải thực hiện 3 bước sau:
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy movie-between_10th_and 20th_seconds.webm
Điều này cho kết quả chính xác nhất. Video dài 20.000 giây và Âm thanh chính xác theo khung hình dài 20.003 giây và có mẫu 960144. Không chính xác phù hợp với luồng video, nhưng nó là OK. Chỉ có 144 mẫu dư. Nhược điểm lớn nhất là, bất cứ khi nào tôi muốn cắt một tệp, tôi phải gửi 3 lệnh cho một công việc đơn giản và nó tạo ra hai tệp không cần thiết: a_stream.webm và v_stream.webm. Và select
bộ lọc không hoạt động trên một số tệp đầu vào tôi đã thử. Nó thực hiện công việc thành công (?) Nhưng không bao giờ dừng quá trình mã hóa, vì vậy tôi phải đóng dấu nhắc lệnh mỗi lần.
select
và aselect
bộ lọc cho các luồng video và âm thanh. Select
là khung hình chính xác cho video, nhưng aselect
không chính xác mẫu. Trên thực tế nó là xa chính xác. Nó cho kết quả tồi tệ hơn nhiều so với việc sử dụng các thông số đơn giản -ss
-to
. Do đó, hiện tại, tôi sử dụng kết hợp select
bộ lọc và -ss
-to
tham số để đạt được hiệu quả cắt chính xác nhất. Nhưng đó là một cách grungy để làm điều đó. Xin vui lòng xem bài viết đầu tiên của tôi, tôi đã thêm một số dòng lệnh và kết quả của họ