如您所知,使用mpmovieplayercontroller对象播放电影

[[MPMoviePlayerController alloc] initWithContentURL: aURL];

现在,我想获得一个自定义的NsurlProtocol,其中我将解密算法加密的电影来源。有可能吗?感谢您给出任何想法。您需要帮助〜

有帮助吗?

解决方案

更新: 我与Apple谈到了这一点,目前不可能将MPMoviePlayerController与Nsurlprotocol子类使用!


嘿,

我不确定,但这可能是可能的。我目前正在研究类似的事情,但还没有完全工作。我发现MPMoviePlayerController与我的自定义NsurlProtocol子类互动,但是考虑到Nsurlrequest的httpheaders似乎很重要,因为它们定义了一系列字节MPMoviePlayerController的需求。

如果将它们丢入NsurlProtocol子类中,您将两次获得类似的东西:

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

}

因此,我的猜测是,只要您可以提供正确的范围并返回MPMoviePlayerController可以播放的MP4文件,就应该有可能!

编辑:这是一个有趣的链接: 保护iPhone和iPad应用中的资源

其他提示

解决方案是通过本地HTTP服务器代理请求。我已经用 可可鼠.

看着那(这 HTTPAsyncFileResponse 例子。

从iOS 7开始,还有一个解决方案。您可以将Avassetresourceloaderdelegate用于Avassetresourceloader。但这只会与Avplayer一起使用。

Apple有一个名为Avarldelegatedemo的演示项目,请查看它,您应该找到所需的东西。 (我认为链接到它不是一个好主意,因此只需在开发人员库中搜索它。

如果有巨大的兴趣,我可以提供概念性的要旨。

@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;
}

注意使用虚拟网址强制使用 AVPlayer 使用 AVAssetResourceLoaderDelegate 方法而不是直接访问URL。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top