Di chuyển cây trồng trong video


8

Tôi có một video HD của một diễn giả đang giảng bài. Tôi muốn thay đổi kích thước video bằng cách cắt từng khung hình, nhưng hình chữ nhật cắt xén cần được tập trung vào đầu của người nói khi anh ấy di chuyển xung quanh sân khấu.

Tôi có thể tạo một tệp chứa X, Y, Width, & height của hình chữ nhật cho mỗi khung hình trong video.

Cách tốt nhất để áp dụng cây trồng chuyển động này vào video là gì?

Nó sẽ hoạt động nếu tôi ..

  1. Sử dụng ffmpeg để trích xuất từng khung hình vào một thư mục
  2. Sử dụng chương trình khác để cắt từng tệp hình ảnh
  3. Sử dụng ffmpeg để xây dựng lại video bằng các tệp hình ảnh bị cắt

Có cách nào tốt hơn để làm điều này?


ImageMagick có thể thực hiện cắt xén nếu bạn có mô tả số của khung cắt. Tôi muốn đề xuất: xuất dưới dạng chuỗi hình ảnh bằng cách sử dụng ffmpeg, xử lý hàng loạt bằng ImageMagick và remux dưới dạng phim trong ffmpeg. Bạn sẽ cần một số loại kịch bản shell để kết dính tất cả lại với nhau. Nếu bạn đăng một ví dụ về tệp với thông tin crop tôi có thể tìm ra các chi tiết cho bạn.
stib

Tôi có thể hỏi làm thế nào bạn tạo tập tin đó? Tôi đang làm việc về chính xác cùng một vấn đề. Tôi có một bằng chứng về khái niệm bằng cách sử dụng bộ lọc trừ ffmpeg tblend và sau đó là bộ lọc cropdetect. Tự hỏi nếu bạn có một cách tốt hơn.
Jannes

Câu trả lời:


2

Tương tự như câu trả lời lớp phủ của Gyan, một phiên bản đơn giản hơn một chút có thể sử dụng một -filter_script cơ bản với các bộ lọc "hoán đổi" và "cắt xén". Di chuyển mục tiêu cây trồng thành 0,0 và sau đó cắt vùng mục tiêu tại 0,0. Mục tiêu phải được hoán đổi thành 0,0 vì nếu không thì các tráo đổi khác có thể chồng lên nhau. Điều này đã làm việc với phiên bản ffmpeg 3.4.6-0ubfox0.18.04.1

Đảm bảo số khung có liên quan đến phần bù được truyền bằng "-ss".

Một ví dụ nhắm mục tiêu cây trồng 1280x720 từ nguồn 4096x2160. Nguồn là 24fps và thông tin theo dõi là 8fps.

crop-filter-script:

swaprect=1280:720:0:0:1568:594:enable='between(n,0,26)',
swaprect=1280:720:0:0:1552:598:enable='between(n,27,29)',
swaprect=1280:720:0:0:1565:583:enable='between(n,30,32)',
swaprect=1280:720:0:0:1603:576:enable='between(n,33,35)',
crop=1280:720:0:0

ffmpeg -ss [start offset] -t [duration] -i input.mov -filter_script:v:0 crop-filter-script -acodec copy out.mov


1

Tôi đã thay đổi thành avconv, vì vậy tôi xin lỗi nếu câu trả lời có thể hơi khác một chút trong ffmpeg cổ điển, nhưng tôi tin rằng không nên có nhiều sự khác biệt.

Bạn có thể có một cây trồng di chuyển nếu bạn có thể tạo một số loại công thức giữa số khung và vị trí của cây trồng; nhưng không có công cụ phân tích có sẵn để làm điều đó. Điều này có nghĩa là nếu người nói di chuyển theo một cách có thể dự đoán về mặt lý thuyết bạn có thể làm điều đó mà không cần một ứng dụng bên ngoài.

Ví dụ, giả sử rằng loa đang di chuyển từ trên cùng bên trái sang dưới cùng bên phải trong hình ảnh. Bạn có thể làm một cái gì đó dọc theo dòng:

avconv -i input.ogv -vf 'crop=200:100:n:n' -c:v libtheora output.ogv

Ở đây tôi đang di chuyển 1 pixel trên mỗi khung hình, rất khó có khả năng ai đó sẽ di chuyển.

Hãy nhớ rằng có khá nhiều hàm toán học được cung cấp bởi giao diện bộ lọc của avconv (và tôi chắc chắn ffmpeg cũng tương tự).

Vì vậy, hãy tưởng tượng rằng bạn muốn di chuyển 1 pixel trên mỗi khung hình, nhưng chỉ từ 200 đến 350 khung hình. Bạn có thể làm

min(max(n,200)-200, 150)

Đối với các khung <200, max(n,200)sẽ tạo 200, sau đó chúng tôi lấy đi 200 để biến thành 0 và sau đó minsẽ trả lại phần đầu tiên cho đến khung 350, trong đó kết quả đó sẽ trở thành hơn 150 và hằng số sẽ bắt đầu được trả về.

Mặc dù viết công thức như vậy bằng tay sẽ khá tẻ nhạt, nhưng có lẽ nó cũng hữu ích trong một số trường hợp.

Đã nói tất cả, nếu tôi có tùy chọn truy cập vào phần mềm có thể hoạt động trên khung hình theo từng khung hình, tôi sẽ đi theo con đường đó.



1

Cho rằng bạn có " một tệp chứa x, Y, Width, & height cho mỗi khung hình ", bạn có thể sử dụng tùy chọn filter_script để thực hiện điều này trong FFmpeg. Bộ lọc cắt không hỗ trợ chỉnh sửa dòng thời gian nhưng bộ lọc lớp phủ thì có. Vì vậy, nếu bạn tạo một khung vẽ trống có cùng độ phân giải với video của bạn và sau đó phủ lớp video lên trên cùng với tọa độ sao cho vùng dự định của bạn được đặt chồng lên trong vùng hiển thị, mục tiêu sẽ đạt được.

Cú pháp cơ bản là

ffmpeg -i in.mp4 -filter_complex_script file.txt -map "[out]" output.mp4

nơi file.txttrông như thế này:

nullsrc=WxH:r=FPS[cv];
[cv][0]overlay=-X0:-Y0:shortest=1:enable='eq(n\,0)'[b0];
[b0][0]overlay=-X1:-Y1:shortest=1:enable='eq(n\,1)'[b1];
[b1][0]overlay=-X2:-Y2:shortest=1:enable='eq(n\,2)'[b2];
...
[bm-1][0]overlay=-Xm:-Ym:shortest=1:enable='eq(n\,m)'[out]

Canvas WHphải bằng kích thước crop (cố định / tĩnh) và giống nhau FPS. Sau đó, mỗi khung hình của video được phủ lên tại ( - X, - Y) sao cho góc trên cùng bên trái của vùng mong muốn nằm ở (0,0) của khung vẽ. Mỗi lớp phủ xảy ra cho một khung. Vì mục đích hiệu quả, nếu bạn có các khoảng thời gian trong đó vùng cắt là tĩnh, bạn nên sử dụng giữa bộ đánh giá, ví dụ:

[bi][0]overlay=-Xi:-Yi:shortest=1:enable='between(n\,1200\,1445)'[bj];

Bạn cũng có thể đánh giá bằng cách sử dụng dấu thời gian tthay vì chỉ số khung.


Tôi đã thử triển khai giải pháp này để xem nó diễn ra như thế nào, chỉ muốn có một phiên bản vũ phu ngay từ đầu để thử nghiệm nên tôi đã không thực hiện giữa, tôi chỉ thêm vị trí cho mỗi khung hình, cho 3000 khung hình đầu tiên. Bộ nhớ ffmpeg của tôi hiện ở mức 36 GB và tốc độ 1 khung hình mỗi phút :( Tôi đoán đây không phải là giải pháp tốt nhất cho mỗi khung hình haha
Eek

Tôi hiện đang ở ngoài thị trấn, nhưng xem xét việc sử dụng bộ lọc trim để cách ly một khung hình và xuất ra Png. Vì vậy, n lệnh cho n khung. Sau đó ghép các hình ảnh vào video
Gyan
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.