Làm thế nào để cắt ở các khung chính xác bằng cách sử dụng ffmpeg?


22

Tôi đang cố gắng sử dụng ffmpeg để cắt các tệp video vào những thời điểm chính xác. Trợ giúp ffmpeg hiển thị tùy chọn -timecode_frame_start để chỉ định khung bắt đầu nhưng tôi không thể để lệnh này hoạt động. Video kết quả luôn bắt đầu ở đầu video gốc. Đây là một ví dụ về lệnh tôi đang chạy:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

Tôi đã di chuyển tùy chọn timecode_frame_start trước và sau các tùy chọn khác mà không thay đổi kết quả. Có một tùy chọn bổ sung tôi cần chỉ định? Tôi đã thử các định dạng tệp khác nhau, mkv, avi, mp4 và không có vấn đề gì liên quan đến codec. Đây là một tập tin tôi đã thử:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

Tui bỏ lỡ điều gì vậy?


có vẻ như điều này đã được trả lời trong danh sách gửi thư (và NB rằng với bản sao -vcodec, bạn không thể "thực sự" cắt được khung cụ thể, vì nó chỉ có thể đồng bộ hóa lại trên i-frames
rogerdpack

@ user39364 Tôi đã hỏi trong danh sách gửi thư và hóa ra tùy chọn này không thực hiện được những gì OP muốn. Tôi cũng đã học được một điều mới :)
slhck

Chỉ muốn lưu ý rằng tôi đã tìm thấy một phương pháp để cắt ở các khung chính xác bằng cách sử dụng melt, hãy xem Chính xác các tệp video được cắt từ dòng lệnh - Siêu người dùng
sdaau

Câu trả lời:


46

Tôi chỉ học được rằng timecode_frame_startkhông hoạt động như thế này. Cách duy nhất để bắt đầu ở các khung cụ thể là chuyển đổi một số khung thành ss.mscú pháp hoặc hh:mm:ss.ms. Vì vậy, nếu video của bạn ở mức 25 khung hình / giây và bạn muốn bắt đầu ở 133 khung hình, bạn sẽ cần

133/25 = 5,32

Vì vậy, chạy

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

Lưu ý rằng việc cắt trên các khung chính xác bằng sao chép dòng bit ( -c:v copy) là không thể vì không phải tất cả các khung đều được mã hóa nội bộ và có thể tự đứng.

-ss sẽ luôn luôn chính xác khung.

Nếu bạn muốn mã hóa một số khung cụ thể, hãy sử dụng -frames:v, ví dụ:

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

Bạn cũng có lựa chọn sử dụng các bộ lọc video , nhưng hỗ trợ âm thanh có thể không chính xác. Và rõ ràng, tìm kiếm trên khung hình vẫn không phải là một tính năng. Bạn có thể theo dõi chủ đề danh sách gửi thư của người dùng FFmpeg này để biết thêm thông tin:

bạn có thể sử dụng -vf selectđể chọn khung chính xác (một cái gì đó muốn -vf 'select=gte(n\,100)'bỏ qua 100 khung hình đầu tiên)


3
đối với các video có khung hình thả xuống (ví dụ 29,97 khung hình / giây) dài hơn 10 phút; Làm thế nào bạn sẽ đi về tính toán chính xác thời gian cho một khung cụ thể?
GFoley83

các select=gte(n\,100)phương pháp hoạt động, nhưng việc tìm kiếm đang ăn lên hiệu suất. Nếu bạn kiểm tra bằng cách mã hóa chỉ 30 khung hình một lần, Tôi càng bắt đầu vào video, ffmpeg càng mất nhiều thời gian để hoàn thành vì tìm kiếm.
Adam Grant

6

Tùy chọn

-vf select = Nhận giữa (n \, start_frame_num \, end_frame_num ), setpts = PTS-STARTPTS "
ví dụ,

-vf select=“between(n\,200\,300),setpts=PTS-STARTPTS"

cắt video từ (bao gồm) khung thứ 200 xuống (bao gồm) khung thứ 300, việc đếm chuỗi bắt đầu từ 0.

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.