Bộ lọc Drawvg cho FFmpeg
Drawvg Filter for FFmpeg
FFmpeg vừa bổ sung filter `drawvg`, cho phép các developer render đồ họa vector trực tiếp lên các frame video. Điểm đặc biệt là nó sử dụng một ngôn ngữ scripting riêng gọi là VGS, kết hợp với thư viện Cairo để rasterization. Nhờ khả năng evaluation biểu thức của FFmpeg, script VGS có thể truy cập dynamic metadata của frame và kích thước, mở ra khả năng tạo animation theo quy trình (procedural animations), thêm các lớp phủ (overlays), hoặc hiển thị dữ liệu trực quan như bounding box trong crop detection. Đây là một công cụ mạnh mẽ để thao tác nội dung video một cách lập trình.
Bộ lọc PlaygroundLanguage ReferenceSource Codedrawvg cho FFmpegdrawvg là bộ lọc FFmpeg, có sẵn từ phiên bản 8.1, để hiển thị đồ họa vector trên đầu khung hình video. Việc kết xuất được thực hiện bằng cách thực thi một tập lệnh...
Sân chơiTham khảo ngôn ngữMã nguồn
bộ lọc drawvg cho FFmpeg
drawvg là một bộ lọc FFmpeg, có sẵn kể từ 8.1, để hiển thị đồ họa vector trên đầu khung hình video.
Việc kết xuất được thực hiện bằng cách thực thi một tập lệnh được viết bằng ngôn ngữ riêng của nó, được gọi là VGS (Tập lệnh đồ họa vector). Kịch bản bao gồm một loạt các lệnh để mô tả đồ họa 2D được tạo điểm ảnh bằng thư viện Cairo.
VGS không nhằm mục đích sử dụng làm ngôn ngữ có mục đích chung. Vì phạm vi của nó là
hạn chế, nó ưu tiên sự ngắn gọn và dễ sử dụng. Cú pháp nặng nề
lấy cảm hứng từ các ngôn ngữ như Đồ họa vectơ Magick hoặc
của SVG. Một số tính năng của cú pháp (như sử dụng khoảng trắng
để phân tách các đối số) cũng có trong các ngôn ngữ như
TCL hoặc
tập lệnh shell.
Nhiều tên lệnh được lấy từ PostScript. VGS được ghi chép đầy đủ trong
tham khảo ngôn ngữ.
Tập lệnh có thể sử dụng biểu thức FFmpeg để mô tả đồ họa một cách linh hoạt, do đó chúng có thể tính toán tọa độ dựa trên kích thước khung, siêu dữ liệu khung, tạo giá trị ngẫu nhiên, đọc màu pixel, v.v.
Ví dụ
Đây là danh sách ngắn các ví dụ để giới thiệu cách tích hợp bộ lọc drawvg với các bộ lọc khác trong FFmpeg.
Playground có một thư viện với nhiều ví dụ hơn, tập trung vào khả năng của ngôn ngữ VGS.
Chỉ báo tiến trình
Biến t có thể được sử dụng để tính toán một trong các góc của lệnh arcn. Sau đó, chúng ta có thể tạo hoạt ảnh như thế này:
Tập lệnh có thể được hiển thị trực tiếp trên đầu video:
Đầu ra
Shell
ffmpeg \
-an \
-ss 12 -t 3 -i bigbuckbunny.mov \
-vf 'crop=iw-1, drawvg=file=progress.vgs, format=yuv420p' \
-c:v libvpx-vp9 \
out.webmVí dụ này sử dụng các clip từ Phim Big Buck Bunny, có sẵn theo CC BY 3.0 giấy phép.
Sử dụng siêu dữ liệu khung
The target="_blank" href="https://ffmpeg.org/ffmpeg-filters.html#crop detect">crop detect bộ lọc tính toán các thông số cắt xén cần thiết để loại bỏ viền đen xung quanh video. Các tham số này được thêm vào mỗi khung dưới dạng siêu dữ liệu.
drawvg có thể truy cập đầu ra của crop detect bằng lệnh getmetadata. Ví dụ sau vẽ một hình chữ nhật màu đỏ để biểu thị diện tích được tính toán theo crop detect.
Đầu ra
Shell
ffmpeg \
-an \
-i đường cao tốc.mp4 \
-vf 'crop detect, drawvg=file=crop detect.vgs, format=yuv420p' \
-c:v libvpx-vp9 \
out.webmVí dụ này sử dụng video Lái xe ban đêm trên đường cao tốc có ô tô chạy qua, được pexels sử dụng miễn phí giấy phép.
Chuyển đổi CircleCrop
Ví dụ này tạo ra quá trình chuyển đổi tương tự như circlecrop chuyển đổi của bộ lọc xfade nhưng vòng tròn có thể được định vị ở bất cứ đâu, không chỉ ở giữa của bộ lọc frame.
Đầu ra
circlecrop.vgs
trực tiếp 0 0 w h
setvar d (sin(PI / 2 * (t - ts)))
vòng tròn (4 * w / 5) (3 * h / 5) (max(w, h) * (1 - d))
eofill
circlecrop.filter
cắt = iw-1 ,
drawvg = file=circlecrop.vgs : Enable='gt(t,0.8)' ,
format = yuv420pShell
ffmpeg \
-an \
-ss 14 -t 4.2 -i bigbuckbunny.mov \
-/vf Circlecrop.filter \
-c:v libvpx-vp9 \
đầu ra.webmVí dụ này sử dụng các clip từ phim Big Buck Bunny, có sẵn dưới CC BY 3.0 giấy phép.
Chuyển đổi tùy chỉnh
Một cách khác để tạo chuyển tiếp tùy chỉnh là sử dụng alphamerge và các bộ lọc lớp phủ, với mặt nạ được hiển thị bằng tập lệnh drawvg.
Đây là đầu ra của tập lệnh drawvg:
alphamerge có thể đặt các khung này làm kênh alpha của một video. Sau đó, sử dụng lớp phủ để đặt video có mặt nạ lên trên một video khác.
Đầu ra
transition.filter
[0] split [mask-bg] [mask-delay] ;
[mask-bg] drawvg = file=transition.vgs [bars] ;
[mask-delay] [bars] concat [mask] ;
[1] [mask] alphamerge [a] ;
[2] [a]
lớp phủ = Enable='lt(t,4)' ,
cắt = iw-1 ,
định dạng = yuv420pShell
ffmpeg \
-f lavfi -i 'color=white:s=853x480:r=24:d=2' \
-ss 16 -t 4 -i bigbuckbunny.mov \
-ss 7:51 -t 6 -i bigbuckbunny.mov \
-/filter_complex transition.filter \
-an \
-c:v libvpx-vp9 \
out.webmVí dụ này sử dụng các clip từ Phim Big Buck Bunny, có sẵn theo CC BY 3.0 giấy phép.
Đọc màu
Hàm p(x, y) trả về màu của pixel tại tọa độ nhất định. Nó có thể được sử dụng để áp dụng pixelize cho một khung, tương tự như bộ lọc pixelize.
Thay vì hình chữ nhật, hình dạng được sử dụng để tạo pixel là hình thoi và mỗi hình có một đường viền mỏng để làm nổi bật đường viền của nó.
Đầu ra bên dưới hiển thị khung gốc ở bên trái và khung được cập nhật bởi tập lệnh drawvg trên đúng:
Đầu ra
pixelate.filter
[0] scale = iw/1.5 : -2 , split [a] [b] ;
[a]
pixel hóa ,
drawvg = file=pixelate.vgs ,
pad = iw*2+30 : ih+20 : iw+20 : ih+10
[a0] ;
[a0] [b]
lớp phủ = 10 : 10 ,
format = yuv420p Shell
ffmpeg \
-an \
-ss 1 -t 18 -i bigbuckbunny.mov \
-/filter_complex pixelate.filter \
-c:v libvpx-vp9 \
đầu ra.webmVí dụ này sử dụng các clip từ phim Big Buck Bunny, có sẵn theo CC BY 3.0 giấy phép.
Waves Effect
drawvg có thể được kết hợp với bộ lọc dịch chuyển để tạo hiệu ứng sóng:
Đầu tiên, tập lệnh drawvg hiển thị các hình chữ nhật nằm ngang với các sắc thái xám khác nhau. Sau đó, boxblur được sử dụng để làm dịu quá trình chuyển đổi giữa các hình chữ nhật. Hình ảnh này được sử dụng làm đầu vào xmap cho displace. Đầu ra bên dưới chứa các hình ảnh trung gian.
Đầu ra
waves.filter
[0] crop = iw-1, split [source0] [source1] ;
[nguồn0]
drawvg = orth 0 0 w h setcolor grey fill ,
vòng lặp = -1 : 1 : 0 ,
tách
[gray0] [gray1] ;
[gray0]
drawvg = file=waves.vgs ,
tách
[xmap_src0] [xmap_src1] ;
[xmap_src0]
boxblur = h/40 ,
tách
[xmap0] [xmap1] ;
[source1] [xmap1] [gray1]
dịch chuyển = tấm gương,
pad = iw*2+30 : ih*2+30 : 10:10
[pad0] ;
[pad0] [xmap_src1] lớp phủ = 10 : h+20 [pad1] ;
[pad1] [source1] lớp phủ = w+20 : 10 : ngắn nhất=1 [pad2] ;
[pad2] [xmap0]
lớp phủ = w+20 : h+20 : ngắn nhất=1 ,
drawtext = text='drawvg' : y=h-20 : x=20 : y_align=baseline : fontsize=32 : fontcolor=white ,
drawtext = text='boxblur' : y=h-20 : x=w/2+20 : y_align=baseline :fontsize=32 : fontcolor=white ,
drawtext = text='Nguồn' : y=h/2-20 : x=w/2+20 : y_align=baseline :fontsize=32 : fontcolor=white ,
định dạng = yuv420pShell
ffmpeg \
-an \
-ss 5 -t 10 -i bigbuckbunny.mov \
-/filter_complex wave.filter \
-c:v libvpx-vp9 \
out.webmVí dụ này sử dụng các clip từ phim Big Buck Bunny, có sẵn theo CC BY 3.0 giấy phép.
Tác giả: nolta