How to play movie with a URL using a custom NSURLProtocol?

前端 未结 4 479
日久生厌
日久生厌 2020-12-08 05:48

As you know,play a movie with MPMoviePlayerController object using

[[MPMoviePlayerController alloc] initWithContentURL: aURL];

now ,i want

相关标签:
4条回答
  • 2020-12-08 06:24
    @property AVPlayerViewController *avPlayerVC;
    @property NSData *yourDataSource
    
    // initialise avPlayerVC
        NSURL *dummyURL     = [NSURL URLWithString:@"foobar://dummy.mov"];// a non-reachable URL will force the use of the resourceLoader
        AVURLAsset *asset   = [AVURLAsset assetWithURL:dummyURL];
        [asset.resourceLoader setDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)];
    
        AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
    
        self.avPlayerVC.player = [AVPlayer playerWithPlayerItem:item];
        self.avPlayerVC.player.actionAtItemEnd  = AVPlayerActionAtItemEndNone;
    
    
    
    // implement AVAssetResourceLoaderDelegate
    
    - (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest {
    
        loadingRequest.contentInformationRequest.contentType    = (__bridge NSString *)kUTTypeQuickTimeMovie;
        loadingRequest.contentInformationRequest.contentLength  = self.yourDataSource.length;
        loadingRequest.contentInformationRequest.byteRangeAccessSupported   = YES;
    
        NSRange range = NSMakeRange((NSUInteger)loadingRequest.dataRequest.requestedOffset, loadingRequest.dataRequest.requestedLength);
        [loadingRequest.dataRequest respondWithData:[self.yourDataSource subdataWithRange:range]];
    
        [loadingRequest finishLoading];
        return YES;
    }
    

    Notice the use of a dummy URL to force AVPlayer to use the AVAssetResourceLoaderDelegate methods instead of accessing the URL directly.

    0 讨论(0)
  • 2020-12-08 06:28

    UPDATE: I spoke to Apple about this and it's not possible to use MPMoviePlayerController with a NSURLProtocol subclass at the moment!


    Hej,

    I am not sure but it could be possible. I am currently working on something similar but haven't got it fully working. What I have found out is that MPMoviePlayerController interacts with my custom NSURLProtocol subclass BUT it seems to be important to take the HTTPHeaders of the NSURLRequest into account because they define a range of bytes the MPMoviePlayerController needs.

    If you dump them in your NSURLProtocol subclass you will get something like this twice for the start:

    2011-01-16 17:00:47.287 iPhoneApp[1177:5f03] Start loading from request: {
    Range = "bytes=0-1";
    

    }

    So my GUESS is that as long as you can provide the correct range and return a mp4 file that can be played by the MPMoviePlayerController it should be possible!

    EDIT: Here is a interesting link: Protecting resources in iPhone and iPad apps

    0 讨论(0)
  • 2020-12-08 06:41

    The solution is to proxy requests through a local HTTP server. I have accomplished this using CocoaHTTPServer.

    Look at the HTTPAsyncFileResponse example.

    0 讨论(0)
  • 2020-12-08 06:43

    There is one more solution as of iOS 7. You can use a AVAssetResourceLoaderDelegate for AVAssetResourceLoader. But this will only work with AVPlayer then.

    There is a demo project by apple called AVARLDelegateDemo have a look at it and you should find what you need. (I think linking to it isn't a good idea, so just search for it in the Developer Library on developer.apple.com) Then use any custom URL scheme (without declaring a NSURLProtocol) and handle that URL scheme in the AVAssetResourceLoaderDelegate.

    If there is a huge interest I could provide a proof of concept gist.

    0 讨论(0)
提交回复
热议问题