Làm cách nào để trích xuất 1 ảnh chụp màn hình cho video bằng ffmpeg tại một thời điểm nhất định?


109

Có rất nhiều hướng dẫn và nội dung chỉ ra cách trích xuất nhiều ảnh chụp màn hình từ một video bằng ffmpeg. Bạn đặt -r và bạn thậm chí có thể bắt đầu một số tiền nhất định trong.

Nhưng tôi chỉ muốn 1 ảnh chụp màn hình ở, giả sử 01:23:45 in. Hoặc 1 ảnh chụp màn hình ở 86% in.

Điều này là hoàn toàn có thể với ffmpegthumbnailer nhưng đó là một sự phụ thuộc khác mà tôi không muốn phụ thuộc vào. Tôi muốn có thể làm điều đó với ffmpeg.

Câu trả lời:


208

Sử dụng -sstùy chọn:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • Đối với đầu ra JPEG sử dụng -q:vđể kiểm soát chất lượng đầu ra. Toàn dải là thang đo tuyến tính từ 1-31 trong đó giá trị thấp hơn dẫn đến chất lượng cao hơn. 2-5 là một phạm vi tốt để thử.

  • Bộ lọc chọn cung cấp một phương pháp thay thế cho các nhu cầu phức tạp hơn như chỉ chọn các loại khung hình nhất định hoặc 1 trên 100, v.v.

  • Đặt -sstrước khi nhập liệu sẽ nhanh hơn. Xem FFmpeg Wiki: Seeking và đoạn trích này từ ffmpegtài liệu công cụ cli :

-ss vị trí (đầu vào / đầu ra)

Khi được sử dụng làm tùy chọn đầu vào (trước đây -i), hãy tìm vị trí trong tệp đầu vào này. Lưu ý rằng trong hầu hết các định dạng, không thể tìm kiếm chính xác, vì vậy ffmpegsẽ tìm kiếm điểm tìm kiếm gần nhất trước vị trí. Khi chuyển mã và -accurate_seekđược bật (mặc định), đoạn bổ sung này giữa điểm tìm kiếm và vị trí sẽ được giải mã và loại bỏ. Khi thực hiện sao chép luồng hoặc khi -noaccurate_seekđược sử dụng, nó sẽ được giữ nguyên.

Khi được sử dụng làm tùy chọn đầu ra (trước tên tệp đầu ra), giải mã nhưng loại bỏ đầu vào cho đến khi dấu thời gian đạt đến vị trí.

vị trí có thể tính bằng giây hoặc ở hh:mm:ss[.xxx]dạng.


2
Điều này nhanh hơn NHIỀU. Cảm ơn bạn rất nhiều. Đặt -ss đầu tiên tạo ra sự khác biệt rất lớn.
Peter Bengtsson

có cách nào để lấy khung hình thứ n sau thời gian quy định không?
dorien

@GuntherPiez Tôi không thấy bất kỳ đề cập nào về các hiện vật có thể có.
Stefan Reich

2
Lưu ý rằng vframesnó đã lỗi thời trong (ít nhất) phiên bản 4.2.2. Theo thủ công "[ vframes] là một bí danh lỗi thời cho ' -frames:v', bạn nên sử dụng bí danh này để thay thế."
Synexis

Hoạt động hoàn hảo và nhanh chóng.
Smeterlink

37

FFMpeg có thể thực hiện việc này bằng cách tìm đến dấu thời gian đã cho và trích xuất chính xác một khung hình dưới dạng hình ảnh, ví dụ:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg

Hãy giải thích các tùy chọn:

-i input file           the path to the input file
-ss 01:23:45            seek the position to the specified timestamp
-vframes 1              only handle one video frame
output.jpg              output filename, should have a well-known extension

Các -sstham số chấp nhận một giá trị theo hình thức HH:MM:SS[.xxx]hoặc là một số trong vài giây. Nếu bạn cần một tỷ lệ phần trăm, bạn cần phải tính toán trước thời lượng video.


Có vẻ hoạt động như mong đợi. Tôi hiện đang đo điểm chuẩn nếu tốc độ này bằng với tốc độ sử dụng ffmpegthumbnailer.
Peter Bengtsson

Vâng, cách tiếp cận này rất chậm. Xem peterbe.com/plog/fastest-way-to-take-screencaps-out-of-videos
Peter Bengtsson

7
hãy thử sử dụng tùy chọn -ss trước -i vì nó sẽ bỏ qua phần giải mã của đường dẫn. Điều này có thể đẩy nhanh quá trình.
SirDarius 19/12/14

1
Có cách nào để xuất dưới dạng PNG vào luồng thay vì tệp không?
Nicke Manarin

1
@NickeManarin Có .. ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg. Lưu ý rằng tôi cũng đặt -sstùy chọn "seek" trước tệp đầu vào trên dòng lệnh, như những người khác đã khuyến nghị.
Glenn Slayden
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.