Trích xuất một trong 10 khung hình trong một video bằng VLC hoặc FFmpeg


12

Tôi đang cố gắng trích xuất "chính xác 1 khung hình cho mỗi 10" khung hình của video (tức là trích xuất 1, để lại 9 rồi lặp lại) cho mục đích khoa học. Video có 105 khung hình, 3,5 giây, 29,97 khung hình / giây (h.264, .mov, được sản xuất bởi Nikon D3100).

Tôi đã tải nó lên đây .

VLC

Lệnh dưới đây sẽ tạo ra 10 khung hình, nhưng nó chỉ tạo ra 6 hình ảnh. Tôi đã thử các tỷ lệ cảnh khác nhau và cả hai đều không tạo ra số khung hình chính xác (thậm chí gần không đúng).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

Ai đó vui lòng cho tôi biết vấn đề là gì?

FFmpeg

FFmpeg dường như không có một lệnh chính xác cho mục đích của tôi. Lệnh bên dưới trích xuất 3 khung hình trong mỗi giây, nhưng vì FPS không chính xác là 30 (chứ không phải 2,97), điều đó sẽ không mang lại kết quả chính xác cho tôi.

Ngoài ra, ngay cả FFmpeg cũng không đưa ra số lượng khung chính xác bằng lệnh này. Trong 3,5 giây video tôi mong đợi tối đa 10 khung hình, nhưng những gì tôi nhận được là 12 khung hình!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

Làm thế nào tôi có thể đạt được những gì tôi muốn?


1
BTW -sameqkhông làm những gì bạn có thể nghĩ, và đã bị xóa khỏi phiên bản hiện tại (ffmpeg thực sự, tôi không chắc nó có trong ffmpeg giả của Ubuntu không). Sử dụng qscale thay thế.
stib

Câu trả lời:


21

Chọn 1 khung hình trong số 10 khung hình

Bạn có thể sử dụng selectbộ lọc video ffmpegđể làm điều này:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • Đối với đầu ra JPG, bạn có thể thay đổi chất lượng với -q:v. Phạm vi hiệu quả là 2 (chất lượng tốt nhất) đến 31 (chất lượng kém nhất). Bạn không cần tùy chọn này nếu bạn muốn xuất ra PNG.

  • Ý chí sản lượng này img_001.jpg, img_002.jpg, img_003.jpgvv


Trông rất thú vị, nhưng dường như đòi hỏi một số phiên bản cụ thể hoặc một cái gì đó được biên dịch thêm. Tôi nhận được " unrecognized option '-filter:v'" với "phiên bản FFmpeg SVN-r0.5.1-4: 0.5.1-1ubfox1.3" (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk

Tôi cũng không thể chạy lệnh và nhận được lỗi sau trên các cửa sổ ffmpeg N-35709-g7d531e8: [select @ 017EBB00] [Eval @ 0022DC08] Thiếu ')' hoặc quá nhiều đối số trong 'mod (n \, 10))' [ select @ 017EBB00] Lỗi khi phân tích cú pháp biểu thức 'not (mod (n \, 10))' Lỗi khởi tạo bộ lọc 'select' với args 'not (mod (n \, 10))' Lỗi mở bộ lọc!
wmac

@mivk Phiên bản FFmpeg của bạn từ repo Ubuntu không có khả năng lọc. Bạn sẽ phải biên dịch FFmpeg .
llogan

1
@wmac Tôi đoán Windows không thích các trích dẫn đơn. Thay đổi chúng thành dấu ngoặc kép : ".
llogan

1
@LordNeckbeard, cảm ơn, nó chạy đúng và giải quyết toàn bộ vấn đề. Tôi thực sự thực sự đánh giá cao sự giúp đỡ của bạn.
wmac

4

Khía cạnh quan trọng nhất trong câu hỏi của bạn là thực tế rằng video sử dụng 29,97 khung hình mỗi giây, chứ không phải 30. NTC kỳ quặc.

Dù sao, tôi nghĩ sẽ dễ dàng nhất khi chỉ trích xuất mọi khung hình , và sau đó loại bỏ những khung hình bạn không cần:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Sau đó, loại bỏ những cái bạn không cần. Vì mỗi khung hình thứ mười sẽ kết thúc bằng a 1.jpg, chúng tôi chỉ có thể lấy tất cả các khung hình khác

find . -maxdepth 1 -not -iname "*1.jpg"

Càng và một khi bạn chắc chắn đây là những thứ bạn muốn xóa:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Nếu bạn có thể sử dụng mencoder, bạn có thể thử framesteptùy chọn, như được giải thích trong tài liệu , như framestep=10trong trường hợp của bạn. Cá nhân tôi không thể cài đặt / thử nó mặc dù.


1
Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn và chỉnh sửa của bạn. Tôi đã thử mencoder và thậm chí cái đó có vấn đề! Tôi đoán nó có một cái gì đó để làm với codec hoặc container. ffmpeg trích xuất chính xác 105 khung hình bằng lệnh dưới đây: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg nhưng mencoder chỉ trích xuất 90 khung hình !!! với lệnh dưới đây: mplayer -vo png 1.mov Sử dụng framestep = 10 cũng tạo ra số khung sai. Tôi bị sốc về cách cả ba (ffmpeg, vlc và mencoder) không thể thực hiện một nhiệm vụ đơn giản như vậy một cách chính xác. Tôi đã gửi một báo cáo lỗi đến trang web VLC. Cảm ơn một lần nữa.
wmac

0

Nếu trước tiên bạn có thể chuyển đổi video thành một loạt các hình ảnh rgb24 hoặc rgb32 thô thì bạn có thể có được số lượng khung hình phù hợp vì ở dạng ban đầu dường như bao gồm các loại khung hình khác thường có thể không phải là hình ảnh ?? ?

Trong Đĩa Laser gốc, toàn bộ video được tạo thành từ một loạt các hình ảnh với số khung hình riêng lẻ từ 1 đến 100.000 trở lên và đó thực sự là cách chính xác để thiết lập đường cơ sở cho các chuyển đổi hoặc thao tác trong tương lai.

Ngành công nghiệp đã thay đổi ý tưởng nén kỳ lạ này chỉ đơn giản là để giảm các khoản tiền tồn tại và làm hỏng các hình thức xử lý khoa học thực sự.

Trước tiên, bạn phải trích xuất bất kỳ âm thanh nào dưới dạng tệp sóng để không bị mất âm thanh hoàn toàn. Dường như FFMPEG đặt thông tin nhận dạng trong mỗi hình ảnh được trích xuất, bởi vì nếu bạn cố gắng xâu chuỗi các hình ảnh lại với nhau từ những hình ảnh vừa trích xuất và bạn trộn các hình ảnh khác từ các nguồn khác với cùng một phần mở rộng, ffmpeg sẽ bỏ qua các hình ảnh bạn đã cố gắng ghép vào giữa mọi thứ .

Với định dạng đĩa laser, tốc độ khung hình chỉ đơn giản được quyết định bởi bất kỳ tốc độ nào bạn trình bày các hình ảnh liên tiếp và không bị kiểm soát theo bất kỳ cách nào bởi chính hình ảnh.

FFMPEG có thể học một bài học từ khoa học thay vì nghệ thuật để xử lý và hiển thị hình ảnh dưới mọi hình thức. Hoặc có thể là toàn bộ ngành công nghiệp AV. Ngành công nghiệp thực sự cần cải thiện khả năng của phần cứng và sử dụng dữ liệu thô đòi hỏi nhiều bộ nhớ / lưu trữ. Không có gì đánh bại dữ liệu thô cho độ chính xác và chính xác.

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.