
[VPMemoryURLProtocol register];[VPMemoryURLProtocol addData:data withname:@"vIDeo"];
这允许我通过像“memory:// vIDeo”这样的URL来引用NSData.
以下是我的自定义NSURLProtocol实现:
NSMutableDictionary* gMemoryMap = nil;@implementation VPMemoryURLProtocol{}+ (voID)register{ static BOol inited = NO; if (!inited) { [NSURLProtocol registerClass:[VPMemoryURLProtocol class]]; inited = YES; }}+ (voID)addData:(NSData *)data withname:(Nsstring *)name{ if (!gMemoryMap) { gMemoryMap = [NSMutableDictionary new]; } gMemoryMap[name] = data;}+ (BOol)canInitWithRequest:(NSURLRequest *)request{ NSLog(@"URL: %@,Scheme: %@",[[request URL] absoluteString],[[request URL] scheme]); Nsstring* theScheme = [[request URL] scheme]; return [theScheme caseInsensitiveCompare:@"memory"] == NSOrderedSame;}+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request{ return request;}- (voID)startLoading{ Nsstring* name = [[self.request URL] path]; NSData* data = gMemoryMap[name]; NSURLResponse* response = [[NSURLResponse alloc] initWithURL:[self.request URL] MIMEType:@"vIDeo/mp4" expectedContentLength:-1 textEnCodingname:nil]; ID<NSURLProtocolClIEnt> clIEnt = [self clIEnt]; [clIEnt URLProtocol:self dIDReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; [clIEnt URLProtocol:self dIDLoadData:data]; [clIEnt URLProtocolDIDFinishLoading:self];}- (voID)stopLoading{} 我不确定这段代码是否有效,但这不是我遇到的问题.尽管注册了自定义协议,但是当我尝试在此代码中使用URL时,从不调用canInitWithRequest:
NSURL* url = [NSURL URLWithString:@"memory://vIDeo"];AVURLAsset* asset = [[AVURLAsset alloc] initWithURL:url options:nil];AVAssetimageGenerator* imageGen = [AVAssetimageGenerator assetimageGeneratorWithAsset:asset];CMTime time = CMTimeMakeWithSeconds(0,600);NSError* error;CMTime actualTime;CGImageRef image = [imageGen copyCGImageAtTime:time actualTime:&actualTime error:&error];UIImage* uiImage = [UIImage imageWithCGImage:image];CGImageRelease(image);
如果我使用“memory:// vIDeo”,图像总是为零,但如果我使用“file:/// …”则工作正常.我错过了什么?为什么没有调用canInitWithRequest? AVFoundation是否仅支持特定的URL协议而不支持自定义协议?
谢谢
解决方法 当然,用于仅支持特定URL方案的基础 – 作为电子书开发人员,我已经看到这种情况发生在通过诸如epub://或zip://之类的URL加载的任何媒体类型上.在这些情况下,在iOS 5.x及更早版本中,通过相关代码进行跟踪会结束QuickTime方法,该方法将URL方案与少数受支持的方案进行比较:文件,http,https,ftp以及iTunes的任何内容用途 – 我忘了它的名字.在iOS 6中,AVFoundation中有一个新的API,它可以在这里提供帮助.虽然我没有亲自使用它,但它应该如何工作:
NSURL* url = [NSURL URLWithString:@"memory://vIDeo"];AVURLAsset* asset = [[AVURLAsset alloc] initWithURL:url options:nil];////////////////////////////////////////////////////////////////// NEW CODE STARTAVAssetResourceLoader* loader = [asset resourceLoader];ID<AVAssetResourceLoaderDelegate> delegate = [SomeClass newInstanceWithNSURLProtocolClass: [VPMemoryURLProtocol class]];[loader setDelegate: delegate queue: some_dispatch_queue];// NEW CODE END////////////////////////////////////////////////////////////////AVAssetimageGenerator* imageGen = [AVAssetimageGenerator assetimageGeneratorWithAsset:asset];CMTime time = CMTimeMakeWithSeconds(0,600);
有了这个,你只需要在某处实现AVAssetResourceLoader协议,这很简单就像it contains only one method.由于你已经有了NSURLProtocol实现,你所有的实际工作都完成了,你可以简单地将实际工作交给Cocoa加载系统或者您的协议类直接.
我再次指出,我还没有真正利用这一点,所以上述内容完全是理论上的.
总结以上是内存溢出为你收集整理的ios – 在自定义NSURLProtocol上使用AVURLAsset全部内容,希望文章能够帮你解决ios – 在自定义NSURLProtocol上使用AVURLAsset所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)