2011-07-04 14 views
10

Tôi đang cố gắng tìm ra cách tiếp cận tốt nhất để hiển thị video trên kết cấu GL trong khi vẫn giữ được độ trong suốt của kênh alpha.iOS: Video dưới dạng kết cấu GL với độ trong suốt alpha

Thông tin về video dưới dạng kết cấu GL ở đây: Is it possible using video as texture for GL in iOS?iOS4: how do I use video file as an OpenGL texture?.

Sử dụng ffmpeg để giúp đỡ với sự minh bạch alpha, nhưng không phải cửa hàng ứng dụng thân thiện là ở đây: iPhone: Display a semi-transparent video on top of a UIView?

Nguồn video sẽ được quay trước một màn hình màu xanh lá cây cho chroma keying. Video có thể bị ảnh hưởng để rời khỏi màn hình màu xanh lá cây hoặc được xử lý trong bộ chỉnh sửa video và xuất sang Quicktime Animation hoặc Apple Pro Res 4444 với Alpha.

Có nhiều cách tiếp cận mà tôi nghĩ có khả năng làm việc, nhưng tôi chưa tìm được giải pháp đầy đủ.

  1. Realtime chế biến ngưỡng của video tìm kiếm màu xanh lá cây để loại bỏ
  2. Hình ra cách để sử dụng codec Quicktime nêu trên để bảo vệ kênh alpha
  3. Trộn hai video với nhau: 1) Video chính với RGB 2) video riêng biệt với alpha che

tôi rất thích có được suy nghĩ của bạn về phương pháp tốt nhất dành cho iOS và OpenGL ES 2.0

Cảm ơn.

+0

Đối với tôi, hoàn toàn không rõ bạn muốn làm gì. Làm thế nào để bạn tải video lên ứng dụng? – tomk

+0

Nhiều khả năng được lưu trữ cục bộ trong gói chính – ryatkins

+0

Bạn luôn có thể thực hiện khóa màu trong trình đổ bóng, đây là một thao tác khá đơn giản. –

Trả lời

0

Apple đã hiển thị ứng dụng mẫu tại WWDC vào năm 2011 có tên ChromaKey cho biết cách xử lý các khung hình của video được truyền tới kết cấu OpenGL, thao tác và tùy chọn được viết ra tệp video.

(Trong một cách rất performant)

Nó được viết để sử dụng một thức ăn chăn nuôi từ các máy quay video, và sử dụng một thuật toán Hiệu ứng Chroma Key rất thô.

Khi người khác nói, có thể bạn sẽ muốn bỏ qua mã chromakey và tự mình loại bỏ màu sắc trước.

Sẽ không khó để viết lại ứng dụng mẫu Chromakey để sử dụng tệp video làm đầu vào thay vì nguồn cấp dữ liệu máy ảnh và thật dễ dàng vô hiệu hóa mã chormakey.

Bạn cần sửa đổi thiết lập trên đầu vào video để mong đợi dữ liệu RGBA thay vì RGB hoặc Y/UV. Ứng dụng mẫu được thiết lập để sử dụng RGB, nhưng tôi đã thấy các ứng dụng ví dụ khác từ Apple sử dụng Y/UV thay thế.

4

Cách dễ nhất để thực hiện khóa chroma cho việc pha trộn đơn giản của một bộ phim và một cảnh khác sẽ là sử dụng GPUImageChromaKeyBlendFilter từ khung công tác GPUImage của tôi. Bạn có thể cung cấp nguồn phim dưới dạng GPUImageMovie và sau đó trộn với nội dung nền của bạn. Bộ lọc khóa màu sắc cho phép bạn chỉ định màu, độ gần với màu đó và độ mịn của việc pha trộn để sử dụng trong thao tác thay thế. Tất cả điều này là tăng tốc GPU thông qua các bóng đổ được điều chỉnh.

Hình ảnh, phim và máy ảnh trực tiếp có thể được sử dụng làm nguồn, nhưng nếu bạn muốn hiển thị nội dung này bằng nội dung OpenGL ES phía sau phim của mình, tôi khuyên bạn nên hiển thị nội dung OpenGL ES của mình. kết cấu đó thông qua GPUImageTextureInput.

Bạn có thể sử dụng tính năng này để xuất kết cấu chứa các khung phim của bạn bằng màu được khóa thay thế bằng màu không đổi với kênh 0 alpha. Kết cấu này có thể được trích xuất bằng cách sử dụng GPUImageTextureOutput để sử dụng sau này trong cảnh OpenGL ES của bạn.

0

Hãy xem ứng dụng "APNG" miễn phí trên cửa hàng ứng dụng. Nó cho thấy cách một PNG động (.apng) có thể được hiển thị trực tiếp trên màn hình iOS. Điều quan trọng là APNG hỗ trợ kênh alpha ở định dạng tệp, vì vậy bạn không cần phải gây rối với các thủ thuật chroma sẽ không thực sự hoạt động cho tất cả nội dung video của bạn. Cách tiếp cận này hiệu quả hơn là nhiều lớp hoặc thủ đoạn sắc độ vì một vòng xử lý khác là không cần thiết mỗi lần kết cấu được hiển thị trong một vòng lặp.

Nếu bạn muốn xem một dự án xcode ví dụ nhỏ hiển thị hoạt ảnh kênh alpha ở phía bên của hình khối quay với OpenGL ES2, nó có thể được tìm thấy tại Load OpenGL textures with alpha channel on iOS. Mã ví dụ cho thấy một cuộc gọi đơn giản tới glTexImage2D() tải lên một kết cấu cho card đồ họa một lần cho mỗi lần gọi lại liên kết hiển thị.