2010-11-21 34 views

Trả lời

19

Kể từ iOS 4.0, bạn có thể sử dụng AVCaptureDeviceInput để lấy máy ảnh làm thiết bị đầu vào và kết nối nó với AVCaptureVideoDataOutput với bất kỳ đối tượng nào bạn muốn đặt làm đại biểu. Bằng cách thiết lập định dạng 32bpp BGRA cho máy ảnh, đối tượng đại biểu sẽ nhận được mỗi khung hình từ máy ảnh ở định dạng hoàn hảo để giao ngay cho glTexImage2D (hoặc glTexSubImage2D nếu thiết bị không hỗ trợ kết cấu không có điện hai; nghĩ rằng các thiết bị MBX thuộc loại này).

Có một loạt các tùy chọn kích thước khung hình và tốc độ khung hình; tại một đoán bạn sẽ phải tinh chỉnh những người phụ thuộc vào bao nhiêu khác bạn muốn sử dụng GPU cho. Tôi thấy rằng một cảnh hoàn toàn tầm thường chỉ với một khung hình kết cấu hiển thị khung hình mới nhất, chỉ vẽ lại chính xác khi một khung hình mới xuất hiện trên iPhone 4, có thể hiển thị nguồn cấp dữ liệu 720p 24fps tối đa của thiết bị mà không có bất kỳ độ trễ đáng chú ý nào. Tôi đã không thực hiện bất kỳ điểm chuẩn kỹ lưỡng hơn thế, vì vậy hy vọng ai đó khác có thể tư vấn.

Về nguyên tắc, theo API, khung có thể quay trở lại với một số đệm trong bộ nhớ giữa các đường quét, điều này có nghĩa là một số nội dung trước khi đăng lên GL, do đó bạn cần triển khai đường dẫn mã cho điều đó. Trong thực tế, nói hoàn toàn theo kinh nghiệm, có vẻ như phiên bản iOS hiện tại không bao giờ trả về hình ảnh trong biểu mẫu đó vì vậy nó không thực sự là vấn đề hiệu suất.

CHỈNH SỬA: bây giờ nó đã rất gần ba năm sau đó. Trong thời gian gần đây, Apple đã phát hành iOS 5, 6 và 7. Với 5 họ đã giới thiệu CVOpenGLESTextureCVOpenGLESTextureCache, hiện là cách thông minh để đưa video từ thiết bị chụp vào OpenGL. Apple cung cấp mã mẫu here, từ đó các phần đặc biệt thú vị nằm trong số RippleViewController.m, cụ thể là setupAVCapturecaptureOutput:didOutputSampleBuffer:fromConnection: - xem các dòng 196–329. Đáng buồn là các điều khoản và điều kiện ngăn chặn một sự trùng lặp của mã ở đây mà không cần gắn toàn bộ dự án nhưng các thiết lập từng bước là:

  1. tạo CVOpenGLESTextureCacheCreate và một AVCaptureSession;
  2. lấy AVCaptureDevice phù hợp cho video;
  3. tạo một AVCaptureDeviceInput bằng thiết bị chụp đó;
  4. đính kèm một số AVCaptureVideoDataOutput và yêu cầu bạn gọi cho bạn làm đại diện bộ đệm mẫu.

Khi nhận được mỗi đệm mẫu:

  1. được CVImageBufferRef từ nó;
  2. sử dụng CVOpenGLESTextureCacheCreateTextureFromImage để nhận Y và UV CVOpenGLESTextureRef s từ bộ đệm hình ảnh CV;
  3. lấy mục tiêu và tên kết cấu từ các kết xuất CV OpenGLES kết cấu để ràng buộc chúng;
  4. kết hợp độ chói và độ chói trong trình đổ bóng của bạn.
+0

Cảm ơn bạn đã trả lời. Tôi sẽ đào nó. – Eonil

+1

Nó chỉ là khoảng 200 dòng để buộc toàn bộ điều với nhau; xin lỗi vì không đăng mã - Tôi đã giải quyết vấn đề chỉ trong khi làm việc vì vậy tôi bị cấm đăng ký hợp đồng từ những gì tôi có. Nhưng nó thực sự là thứ tầm thường và tôi chắc chắn đã dành nhiều thời gian hơn để tìm ra những lớp học thích hợp trong tài liệu hơn là tôi đã viết mã. – Tommy

+0

@Eonil Nếu bạn thích câu trả lời của mình, hãy đánh dấu nó là câu trả lời được chấp nhận. – pr1001

0

Sử dụng RosyWriter để có ví dụ tốt hơn về cách thực hiện hiển thị video OpenGL. Hiệu suất rất tốt, đặc biệt nếu bạn giảm tốc độ khung hình (~ 10% ở mức 1080p/30,> = 5% ở mức 1080p/15.

Các vấn đề liên quan