2014-05-12 4 views
2

J'ai réussi à obtenir AVPlayer de travail avec AVAssetResourceLoaderDelegate pour lire le fichier m4a sur iOS 7 mais je ne peux pas le faire sur iOS 6.AVAssetResourceLoaderDelegate protocole sur iOS 6

La méthode déléguée

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader 
shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest 

est appelé avec la demande suivante:

2014-05-12 15:14:58.798 AVPlayer-Delegate[661:1103] Requested data: { 
    Range = "bytes=0-1"; 
    "X-Playback-Session-Id" = "5B64BE4E-442A-4A37-9263-04D22CDBCB28"; 
} 

Je retourne les deux premiers octets comme demandé, mais la méthode de délégué est jamais appelé à nouveau. J'essayais de fournir différents en-têtes dans l'objet de réponse que je transmets mais cela n'a pas aidé.

Ceci est mon application:

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader 

shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest 

{ 

    NSLog(@"Requested data: %@", 

      loadingRequest.request.allHTTPHeaderFields); 

    NSDictionary *headers = @{@"Content-Type": @"audio/x-m4a", 

           @"Accept-Ranges" : @"bytes", 

           @"Content-Length" : [NSString stringWithFormat:@"%d", 2], 

           @"Content-Range" : [NSString stringWithFormat:@"bytes 0-1/%d", self.fileData.length], 

           @"X-Playback-Session-Id" : loadingRequest.request.allHTTPHeaderFields[@"X-Playback-Session-Id"], 

           @"ETag" : @"TAG"}; 

    NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:loadingRequest.request.URL statusCode:206 HTTPVersion:@"HTTP/1.1" headerFields:headers]; 

    //NSURLResponse *response = [[NSURLResponse alloc] initWithURL:loadingRequest.request.URL MIMEType:@"audio/m4a" expectedContentLength:self.fileData.length textEncodingName:@"UTF-8"]; 



    NSData *requestedData = [self.fileData subdataWithRange:NSMakeRange(0, 2)]; 

    [loadingRequest finishLoadingWithResponse:response data:requestedData redirect:nil]; 



    return YES; 

} 

Je voudrais vraiment apprécier toute aide avec elle.

Merci.

+0

Avez-vous déjà trouvé une solution? Je vois le même comportement (seulement les deux premiers octets demandés) sur un appareil iOS 7. Il n'y a aucune demande après la demande initiale pour les deux premiers octets. – Alexander

Répondre

1

AVAssetResourceLoaderDelegate fonctionne différemment sur iOS 6 et IOS 7. Voir What's New in IOS 7.0

Le protocole AVAssetResourceLoaderDelegate prend désormais en charge le chargement de plages arbitraires d'octets à partir d'une ressource média.

La solution de contournement pré-IOS7 standard consiste à utiliser un serveur HTTP local. Voir par exemple https://stackoverflow.com/a/21225985

+0

Alors quel est le but du protocole AVAssetResourceLoaderDelegate sur iOS 6 s'il ne peut pas être utilisé pour charger des plages arbitraires d'octets? Y a-t-il d'autres scénarios d'utilisation possibles? Merci. –