2013-08-13 42 views
7

Các tài liệu nói về AVURLAsset.resourceLoader:Cách sử dụng AVAssetResourceLoader?

Trong tải, các đối tượng bộ nạp tài nguyên có thể được yêu cầu để hỗ trợ trong việc tải các tài nguyên. Ví dụ: tài nguyên yêu cầu giải mã có thể dẫn đến trình tải tài nguyên được yêu cầu cung cấp các khóa giải mã thích hợp. Bạn có thể gán một đối tượng đại biểu cho đối tượng bộ nạp tài nguyên và sử dụng ủy nhiệm của bạn để chặn các yêu cầu này và cung cấp một phản hồi thích hợp.

Vì vậy, những gì tôi đang cố gắng để làm trong mã của tôi là:

NSURL* url = ...; 
_asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 

AVAssetResourceLoader* loader = _asset.resourceLoader; 
[loader setDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; 

_playerItem = [AVPlayerItem playerItemWithAsset:_asset]; 
_player = [AVPlayer playerWithPlayerItem:_playerItem]; 

// ... setting up the player layer 

[_player play]; 

và cũng trong lớp học của tôi, tôi thêm AVAssetResourceLoaderDelegate vào @ interface và cũng thực hiện phương pháp:

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest 
{ 
    NSLog(@"YES"); 
    return YES; 
} 

Dù URL được chuyển, phương pháp này không bao giờ được gọi. Không thay đổi nếu URL là phương tiện hợp lệ qua HTTP hoặc sử dụng NSURLProtocol đã đăng ký tùy chỉnh của tôi.

Khi nào trình tải tài nguyên giả sử gọi cho người được ủy quyền?

Trả lời

0

Bạn cần có thể thay thế resourceLoader như:

AVAssetResourceLoader* resource_loader = [some_AVAsset resourceLoader]; 
[resource_loader setDelegate:your_resource_data_loader queue:your_dispatch_queue]; 
+1

Sai. Từ tài liệu của Apple: * "Bạn không tự tạo các đối tượng tải tài nguyên. Thay vào đó, bạn lấy trình tải tài nguyên từ thuộc tính resourceLoader của đối tượng AVURLAsset và sử dụng nó để gán đối tượng đại biểu tùy chỉnh của bạn." * –

+1

Và đó là cách thực hiện : AVAssetResourceLoader * resource_loader = [some_AVAsset resourceLoader]; sẽ không tạo ra bất kỳ điều gì mới nhưng nó sẽ trả về resourceloader từ avasset – Marcin

7

Bạn nên cố gắng sử dụng một chương trình URL tùy chỉnh, ví dụ: thay vì sử dụng http://myserver.com/listen.m3umy_custom_scheme://myserver.com/listen.m3u. Theo mặc định, HTTP & HTTPS được Apple xử lý để đại biểu sẽ không được gọi. Để bỏ qua điều này, bạn cần sử dụng một lược đồ tùy chỉnh để thực hiện cuộc gọi cho các phương thức ủy nhiệm.