Làm cách nào để trích xuất tất cả các khung chính từ một video clip?


10

Tôi đang cố gắng trích xuất các khung hình chính từ một video clip. Tôi đã thử lệnh sau, nhưng nó trích xuất tất cả các khung.

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg

Câu trả lời:


20

Bạn có thể làm điều này đơn giản hơn bằng cách sử dụng -skip_framemà không cần selectbộ lọc video:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg

2
Thật tuyệt vời, mất ít hơn 10 giây cho một video 20 phút so với hơn 3 phút với bộ lọc chọn lọc!
điên

Hãy chắc chắn để sử dụng -threads 1, so với mặc định, -threads autonó làm cho cropdetectđồ thị bộ lọc ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) nhanh gấp 2 lần trên hệ thống của tôi (60 giây xuống còn 30 giây)!
genpfault

Tôi sẽ không sử dụng Skip_frame nokey. Bạn thậm chí đã kiểm tra đầu ra? Trên các tệp và bản dựng của tôi (aug 2019), tôi nhận được tem thời gian không phù hợp, vì trong nokey cung cấp cho tôi khung trước trước khung I, trong khi khung không lọc / tất cả các khung hiển thị khung I ở tem thời gian sau.
JasonXA

Lý do @genpfault gợi ý sử dụng -threads 1là vì nếu không thì chuỗi các khung hình chính đầu ra có thể được phát hành không theo thứ tự. Nếu bạn có một số loại sau hoc cách đối phó với vấn đề này, bạn có thể giữ lại đa luồng. Ngoài ra, dường như vẫn có thể nhận được các khung hình không theo thứ tự, ngay cả khi sử dụng -threads 1 , nhưng trong trường hợp này, tất cả các sự cố như vậy dường như được đi kèm / gắn cờ bởi lỗi bộ giải mã h264 illegal short term buffer state detected.
Glenn Slayden

12

Ví dụ sử dụng bộ lọc selectscale:

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg

IT tiên boa:

  • Các bộ lọc không nên đi trước -itùy chọn, vì chúng là một tùy chọn đầu ra. Tôi không biết chính xác bạn đã nhận lệnh từ đâu, nhưng PICT_TYPE_Ikhông tồn tại - nó nên như vậy I.

  • Trong scalebộ lọc, bạn có thể thay thế 73hoặc 41để bộ lọc tự động tính toán chiều rộng hoặc chiều cao để duy trì tỷ lệ khung hình: chẳng hạn như scale=73:-1hoặc scale=-1:41. Điều này ngăn cản việc kéo dài hoặc squishing có thể dẫn đến việc chia tỷ lệ "bắt buộc".

  • Chất lượng đầu ra có thể được kiểm soát bằng -qscale:v(hoặc bí danh -q:v). Phạm vi hiệu quả là thang đo tuyến tính từ 2 đến 31 và giá trị thấp hơn là chất lượng cao hơn.

  • Rằng bạn ffmpegcho phép một bộ lọc trước khi đầu vào cho tôi biết nó có thể bị lỗi thời. Tải xuống bản dựng tĩnh gần đây cho hệ điều hành của bạn hoặc tự xây dựng bản thân theo hướng dẫn biên dịch nếu cách trên không hoạt động.


1
Nếu mục tiêu của bạn là trích xuất các khung chính một cách dễ dàng, bạn có thể thử các cách sau:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Peltier

0

nếu lỗi này

Tùy chọn vf (đặt bộ lọc video) không thể được áp dụng cho url đầu vào 1508.mp4 - bạn đang cố gắng áp dụng tùy chọn đầu vào cho tệp đầu ra hoặc ngược lại. Di chuyển tùy chọn này trước khi tập tin thuộc về nó. Lỗi phân tích tùy chọn cho tệp đầu vào 1508.mp4. Lỗi mở tệp đầu vào: Đối số không hợp lệ

bạn có thể làm được việc này:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

Thông số trước -i

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.