Tin tức chung·Hacker News·1 lượt xem

Bộ lọc Drawvg cho FFmpeg

Drawvg Filter for FFmpeg

AI Summary

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.webm

Ví 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.webm

Ví 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 = yuv420p

Shell

ffmpeg \
    -an \
    -ss 14 -t 4.2 -i bigbuckbunny.mov \
    -/vf Circlecrop.filter \
    -c:v libvpx-vp9 \
    đầu ra.webm

Ví 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 = yuv420p

Shell

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.webm

Ví 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.webm

Ví 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 = yuv420p

Shell

ffmpeg \
    -an \
    -ss 5 -t 10 -i bigbuckbunny.mov \
    -/filter_complex wave.filter \
    -c:v libvpx-vp9 \
    out.webm

Ví 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

#discussion