2012-12-18 22 views
5

Tôi đang làm việc trên một dự án iOS sử dụng AV-Out để hiển thị nội dung trong cửa sổ 1280x720 trên màn hình thứ hai.GPUImage Video có độ trong suốt trên UIView

Tôi có chế độ xem MPMoviePlayerController làm nền và trên cùng của các yếu tố khác khác như UIImagesUILabels. Phim nền phát trong một vòng lặp.

Bây giờ tôi muốn che phủ toàn bộ khung nhìn bao gồm tất cả các thành phần hiển thị với một hoạt ảnh toàn màn hình khác có độ trong suốt để chỉ hiển thị các phần của chế độ xem cơ bản.

Lần đầu tiên tôi thử hoạt ảnh png với UIImageView. Tôi đã ngạc nhiên khi thấy rằng thực sự hoạt động trên iPhone5, nhưng tất nhiên pngs có kích thước quá lớn đến nỗi nó sử dụng quá nhiều ram và nó bị treo trên mọi thứ bên dưới iPhone4. Vì vậy, tôi cần một cách khác.

Tôi đã tìm ra cách phát một bộ phim thứ hai cùng lúc bằng AVFoundation. Cho đến nay, rất tốt. Bây giờ tôi có thể chơi video lớp phủ, nhưng tất nhiên nó không phải là trasparent.

Tôi cũng đã học được rằng với thư viện GPUImage tôi có thể sử dụng GPUImageChromaKeyBlendFilter để lọc màu khỏi video để làm cho nó trong suốt và sau đó kết hợp nó với một video khác.

Điều tôi chưa hiểu là cách tốt nhất để triển khai nó trong trường hợp của tôi để có được kết quả mà tôi muốn.

Tôi có thể sử dụng toàn bộ phân cấp chế độ xem bên dưới video hàng đầu làm đầu vào đầu tiên cho GPUImageChromaKeyBlendFilter và video kiểu màn hình xanh làm đầu vào thứ hai và hiển thị kết quả trực tiếp ở 720p không? làm thế nào tôi sẽ làm điều đó?

Hoặc tốt hơn nên sử dụng GPUImageChromaKeyFilter và chỉ lọc video kiểu màn hình xanh và phát video trong chế độ xem phía trên tất cả các chế độ xem khác? Nền sau của video này có trong suốt không?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

3

Bạn cần tạo trình phát tùy chỉnh bằng cách sử dụng AVFoundation.framework và sau đó sử dụng video có kênh alpha. Khung công tác AVFoundation cho phép quay video mạnh mẽ hơn nhiều mà không có nhiều hạn chế của khung công tác MPMedia. Xây dựng trình phát tùy chỉnh không khó như mọi người. Tôi đã viết một hướng dẫn về nó ở đây: http://www.sdkboy.com/?p=66

CÁCH KHÁC ..........

Ví dụ SimpleVideoFileFilter trong khuôn khổ Triển lãm làm thế nào để tải một bộ phim, lọc nó, và mã hóa nó trở lại đĩa. Sửa đổi này để thực hiện chroma keying đưa ra sau đây:

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"m4v"]; 
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; 

filter = [[GPUImageChromaKeyBlendFilter alloc] init]; 
[filter setColorToReplaceRed:0.0 green:0.0 blue:1.0]; 
[filter setThresholdSensitivity:0.4]; 

[movieFile addTarget:filter]; 

UIImage *inputImage = [UIImage imageNamed:@"background.jpg"]; 
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; 
[sourcePicture addTarget:filter]; 

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; 
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; 
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; 
[filter addTarget:movieWriter]; 

[movieWriter startRecording]; 
[movieFile startProcessing]; 

[movieWriter setCompletionBlock:^{ 
    [filter removeTarget:movieWriter]; 
    [movieWriter finishRecording]; 
}]; 

Đoạn mã trên sẽ được tải một bộ phim từ các nguồn tài nguyên của ứng dụng gọi sample.m4v, thức ăn nó vào một bộ lọc chroma key được thiết lập để key off xanh tinh khiết với độ nhạy 0,4, đính kèm một hình nền để sử dụng cho khóa chroma, và sau đó gửi tất cả cho bộ mã hóa phim viết Movie.m4v trong thư mục/Documents của ứng dụng.

Bạn có thể điều chỉnh ngưỡng và màu xanh cụ thể để phù hợp với nhu cầu của mình, cũng như thay thế hình ảnh đầu vào bằng phim khác hoặc nguồn khác nếu cần. Quá trình này cũng có thể được áp dụng cho video trực tiếp từ máy ảnh của thiết bị iOS và bạn có thể hiển thị kết quả cho màn hình nếu muốn.

Trên iPhone 4 chạy iOS 5.0, khóa chroma mất 1,8 mili giây (500 + FPS) cho 640x480 khung hình video, 65 mili giây cho khung 720p (15 FPS). Các thiết bị dựa trên A5 mới hơn nhanh hơn 6-10X so với các hoạt động này, vì vậy chúng có thể xử lý video 1080p mà không làm đổ mồ hôi. Tôi sử dụng bộ nhớ cache kết cấu nhanh của iOS 5.0 cho cả tải lên và khôi phục khung hình, giúp tăng tốc quá trình xử lý trên phiên bản hệ điều hành đó hơn 4.x.

Một cảnh báo mà tôi có về điều này là tôi đã không nhận được âm thanh để ghi ngay trong mã hóa phim của tôi, nhưng tôi đang làm việc trên đó ngay bây giờ.

0

Ví dụ SimpleVideoFileFilter trong khung làm việc cho biết cách tải phim, lọc phim và mã hóa nó trở lại đĩa. Sửa đổi này để thực hiện chroma keying đưa ra sau đây:

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"m4v"]; 
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; 

filter = [[GPUImageChromaKeyBlendFilter alloc] init]; 
[filter setColorToReplaceRed:0.0 green:0.0 blue:1.0]; 
[filter setThresholdSensitivity:0.4]; 

[movieFile addTarget:filter]; 

UIImage *inputImage = [UIImage imageNamed:@"background.jpg"]; 
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; 
[sourcePicture addTarget:filter]; 

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; 
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; 
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; 
[filter addTarget:movieWriter]; 

[movieWriter startRecording]; 
[movieFile startProcessing]; 

[movieWriter setCompletionBlock:^{ 
    [filter removeTarget:movieWriter]; 
    [movieWriter finishRecording]; 
}]; 

Đoạn mã trên sẽ được tải một bộ phim từ các nguồn tài nguyên của ứng dụng gọi sample.m4v, thức ăn nó vào một bộ lọc chroma key được thiết lập để key off xanh tinh khiết với độ nhạy 0,4, đính kèm một hình nền để sử dụng cho khóa chroma, và sau đó gửi tất cả cho bộ mã hóa phim viết Movie.m4v trong thư mục/Documents của ứng dụng.

Bạn có thể điều chỉnh ngưỡng và màu xanh cụ thể để phù hợp với nhu cầu của mình, cũng như thay thế hình ảnh đầu vào bằng phim khác hoặc nguồn khác nếu cần. Quá trình này cũng có thể được áp dụng cho video trực tiếp từ máy ảnh của thiết bị iOS và bạn có thể hiển thị kết quả cho màn hình nếu muốn.

Trên iPhone 4 chạy iOS 5.0, khóa chroma mất 1,8 mili giây (500 + FPS) cho 640x480 khung hình video, 65 mili giây cho khung 720p (15 FPS). Các thiết bị dựa trên A5 mới hơn nhanh hơn 6-10X so với các hoạt động này, vì vậy chúng có thể xử lý video 1080p mà không làm đổ mồ hôi. Tôi sử dụng bộ nhớ cache kết cấu nhanh của iOS 5.0 cho cả tải lên và khôi phục khung hình, giúp tăng tốc quá trình xử lý trên phiên bản hệ điều hành đó hơn 4.x.

Một cảnh báo mà tôi có về điều này là tôi đã không nhận được âm thanh để ghi ngay trong mã hóa phim của tôi, nhưng tôi đang làm việc trên đó ngay bây giờ.

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