Cắt video ở các khung chính xác với bộ lọc chọn ffmpeg


16

Thay vì sử dụng -ss-totì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: selectbộ 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 -ssthô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-sstham số cùng nhau, vì -sssẽ ả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à selectbộ 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.


Tôi đã đọc trang đó trước khi tôi đăng câu hỏi này. Trang đó không giúp tôi. Nếu một đầu vào có fps biến, chúng ta có thể tính toán đơn giản bằng cách sử dụng phương trình đó không? Tôi không nghĩ vậy. Ngoài ra, tôi vẫn không nghĩ rằng '-ss' sẽ cho tôi vị trí chính xác. Tôi đoán từng khung hình sẽ tốt hơn.
mệnh

Lưu ý rằng -sschính xác khung (xem tại đây ). Bạn có thực sự có đầu vào biến-fps? Câu trả lời của tôi liên kết đến chuỗi danh sách gửi thư có đề cập đến việc sử dụng selectcác bộ lọc trong đó bạn có thể chỉ định số khung. Bạn đã thử chưa?
slhck

Tôi đã thử sử dụng selectaselectbộ lọc cho các luồng video và âm thanh. Selectlà khung hình chính xác cho video, nhưng aselectkhô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 selectbộ lọc và -ss -totham 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ọ
phận

phiên bản ffmpeg?
fie

Tại sao bạn vẫn cố gắng cắt giảm một số khung hình. Nếu một người cần loại chính xác đó thì tại sao không sử dụng avidemux? Cũng có thể vấn đề ban đầu của bạn là vì nó chọn khung khóa gần nhất?
fie

Câu trả lời:


3

Âm thanh phát ra từ giây chứ không phải khung hình, vì vậy nếu bạn muốn cắt video, bạn phải tính toán video fps × 20 giây như thế này: 20 giây 23,97 fps = 479,4

Cắt khung hình không chính xác vì bạn không thể có được khung hình / giây đầy đủ trong giây cuối cùng, vì vậy âm thanh sẽ nhận được nhiều giây hơn hoặc chỉ một nửa giây hoặc hơn một chút hoặc ít hơn! Có lẽ bạn nên sử dụng giây thay vì khung để cắt chính xác, bạn nói với ffmpeg để làm điều đó cho bạn. Và nếu bạn có thêm 1 khung hình, điều gì sẽ thay đổi khung hình thứ 250 và 750 thành khung hình thứ 250 và 749?! Sử dụng trừ 1 ở đó để luôn nhận được bao nhiêu khung hình bạn yêu cầu!


Thực tế âm thanh đến từ các mẫu, không phải vài giây ...
Anubioz
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.