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?
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." * –
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