2010-12-08 11 views
8

Bildiğiniz gibi,Film, özel bir NSURLProtocol kullanarak bir URL ile nasıl oynanır?

[[MPMoviePlayerController alloc] initWithContentURL: aURL]; 

şimdi, ben AlgorithmDES tarafından şifrelemek edilecek olan bir film kaynağını deşifre alacağı özel bir NSURLProtocol ulaşmak istiyoruz kullanarak MPMoviePlayerController nesne ile bir film oynarlar. Bu olasılık mı? Eğer yardım herhangi ideas.need ~ verdiğiniz için teşekkürler

+1

Merhaba, Sizin gibi aynı özelliği uygulamak istiyorum. Şifrelenmiş video dosyası sunucuda var. ve aynı videoyu akışla oynatmak istiyorum. Bu nasıl mümkün olabilir? Teşekkürler – Developer

cevap

13

GÜNCELLEME: Bu konuda Apple'a konuştu ve o anda bir NSURLProtocol alt sınıf ile MPMoviePlayerController kullanmak mümkün değildir!


Hej

,

emin değilim ama mümkün olabilir. Şu anda benzer bir şey üzerinde çalışıyorum ama tam olarak çalışmıyor. Ne öğrendim MPMoviePlayerController benim özel NSURLProtocol alt sınıf ile etkileşime girer, ancak onlar MPMoviePlayerController ihtiyaçlarının bir bayt aralığı tanımlamak çünkü NSURLRequest HTTPHeaders dikkate almak için önemli gibi görünüyor. Eğer NSURLProtocol alt sınıfta onları dökümü olursa

başından iki kez böyle bir şey alacak:

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

}

Yani benim TAHMİN sürece doğru dağılımı sağlayamaz ve şekilde olmasıdır MPMoviePlayerController tarafından çalınabilecek bir mp4 dosyası döndürmek mümkün olmalıdır!

DÜZENLEME: Protecting resources in iPhone and iPad apps

+0

Ben oyuncunun kendi başına ayrıştırmak url ihtiyaç olduğunu bulmak, oyuncu nasıl url ayrıştırmak için yol buluyorum, ama elma bunun için bize vermezdi. – ben

+0

NSURLProtocol'da bu özel başlangıç ​​yüklemesini aralıklı içeren hiçbir yöntem görmüyorum. Muhtemelen özel bir yöntem. Bunun hakkında bir ipucu var mı? – BadPirate

+0

NSURLProtocol alt sınıfınızın startLoading yönteminde 'NSDictionary * headers = [self.request allHTTPHeaderFields]; halinde ([[başlıklar AllKeys] containsObject: "Aralık" @]) \t { \t \t NSLog (@ "Aralık:% @", [başlıklar objectForKey: @ "sınıf"]); \t} –

6

çözüm vekil istekleri için yerel HTTP sunucusu üzerinden: Aşağıda ilginç bağlantıdır. Bunu CocoaHTTPServer kullanarak gerçekleştirdim.

Örnek HTTPAsyncFileResponse örneğine bakın.

+0

Video akışı için yerel bir sunucu uygulayacağım. Ama nasıl başlayacağımı bilmiyorum :(. Beni nasıl oluşturduğumu paylaşır mısınız.Çok teşekkürler – sahara108

+0

AVAssetResourceLoader yaklaşımını denedim ve işe yaramazdım.Çok basit bir şey için çok fazla iş gibi görünüyor (sadece istiyorum AVPlayer URL isteğindeki özel başlık) Bunu CocoaHTTPServer ile nasıl uygulayacağınız hakkında bilgi verebilir misiniz? – mixtly87

5

iOS 7'den başka bir çözüm daha var. AVAssetResourceLoader için bir AVAssetResourceLoaderDelegate kullanabilirsiniz. Ama bu sadece AVPlayer ile çalışır.

AVARLDelegateDemo adında bir demo projesi var ve ihtiyacınız olanı bulmanız gerekiyor. (Bunun için bağlantı oluşturmanın iyi bir fikir olmadığını düşünüyorum, bu yüzden developer.apple.com'daki Geliştirici Kitaplığı'nda arama yapın) Ardından, herhangi bir özel URL şemasını (bir NSURLProtocol bildirmeden) kullanın ve bu URL şemasını AVAssetResourceLoaderDelegate'de işleyin. Büyük bir ilgi varsa, kavram özünü kanıtlayabilirim. bir kukla URL kullanımının

+1

Bunu iOS8 AVPlayerViewController ile birleştirin ve bulduğum en iyi çözüm budur. –

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

Bildirim URL'yi doğrudan erişmek yerine AVAssetResourceLoaderDelegate yöntemleri kullanmaya AVPlayer zorlamak için.

İlgili konular