ffmpeg loại bỏ các bộ phận mà không có chuyển động


15

Tôi có một camera an ninh IP (192.168.0.8) có thể phát nội dung rtsp qua mạng.

Tôi có thể lưu nội dung (RAW) đó mà không cần thay đổi bằng lệnh ffmpeg tiếp theo từ máy tính của mình:

ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -acodec copy -vcodec copy test-raw.mp4

Tôi cũng có thể thay đổi kích thước nó một cách nhanh chóng:

ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -vf  "scale=640:-1" test640.mp4

Nhưng làm thế nào để chỉ lưu video đó chỉ chứa các phần phát hiện chuyển động?

Tôi đã cố gắng giải quyết nó bằng các bộ lọc thay đổi cảnh của ffmpeg , nhưng không gặp may.

Mục tiêu của tôi - để có giải pháp giám sát video phổ biến, phát hiện khi ai đó di chuyển gần camera và lưu nó vào tệp video. Tôi hiểu rằng có thể không thể thực hiện được khi đang phát trực tuyến, vì vậy trước tiên tôi có thể lưu tệp lớn, sau đó xử lý nó bằng một lệnh ffmpeg khác và tạo tệp video mới chỉ chứa các phần được phát hiện chuyển động. Nếu bạn có thể cho tôi lời khuyên chính xác những gì tôi nên nghiên cứu thêm, tôi sẽ thực sự biết ơn.

Luồng máy ảnh của tôi được truyền đi mà không có âm thanh. Vì vậy, tôi có thể tạo tập hợp hình ảnh từ video gốc, sau đó chọn hình ảnh phù hợp và sau đó lưu video mới từ hình ảnh.


Bạn có muốn thực hiện hệ thống này hoặc tìm một sản phẩm đã sẵn sàng để sử dụng?
Woeitg

@WOEITG Tôi chỉ cần bất kỳ giải pháp làm việc miễn phí nào cho Ubuntu 15.04+
rfedorov

Đối với Windows, có một phần mềm được gọi là ispy, mà bạn có thể thiết lập để ghi lại khi phát hiện chuyển động. Vì bạn đang yêu cầu một giải pháp Linux, zoneminder.com sẽ là một sản phẩm tương tự. Thật không may, tôi không có câu trả lời trực tiếp cho câu hỏi của bạn, nhưng +1 vì tôi cũng muốn có câu trả lời
MyNameWouldGoHere 4/1/2016

Câu trả lời:


7

Những gì tôi sẽ làm là thực hiện chính xác như bạn đã nói và lưu một tệp lớn của luồng, sau đó sử dụng select bộ lọc FFMPEG với scenebiểu thức, để so sánh sự giống nhau của các khung liên tiếp: select=gt(scene\,0.003)ví dụ. Con số càng cao, càng nhiều thay đổi giữa các khung hình bị bỏ qua, trong thử nghiệm nhanh, bạn có thể cần phải xuống thấp đến 0,00001-0,00005 tùy thuộc vào loại cảnh bạn đang xử lý.

Kết hợp điều đó với setpts bộ lọc , điều chỉnh "thời gian bắt đầu" của các khung hình video và bạn sẽ kết thúc với một cái gì đó như (đối với video 25 khung hình / giây):

ffmpeg -i input.mp4 -vf "select=gt(scene\,0.003),setpts=N/(25*TB)" output.mp4

Nhắc bạn, bạn sẽ không thể sử dụng -vcodec copykhi bạn sử dụng các bộ lọc video.

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.