2010-12-08 3 views
8

은 아시다시피,사용자 지정 NSURLProtocol을 사용하여 URL로 영화를 재생하는 방법은 무엇입니까?

[[MPMoviePlayerController alloc] initWithContentURL: aURL]; 

지금, 내가 AlgorithmDES에 의해 암호화 할 한 영화 소스를 해독 할에서 사용자 지정 NSURLProtocol을 달성하고자 사용 MPMoviePlayerController 객체와 영화를 재생할 수 있습니다. 그럴 가능성이 있습니까? 어떤 아이디어를 주셔서 감사합니다. 당신이 도와 줘야합니다 ~

+1

안녕하세요, 저는 여러분과 같은 기능을 구현하고 싶습니다. 서버에 비디오 파일을 암호화했습니다. 스트리밍으로 동일한 비디오를 재생하고 싶습니다. 그게 어떻게 가능할까요? 감사합니다 – Developer

답변

13

업데이트 : 나는 이것에 대해 애플에게 말했고 현재 NSURLProtocol 서브 클래스와 함께 MPMoviePlayerController를 사용할 수 없습니다!


HEJ

,

나는 확실하지 않다하지만 할 수 있습니다. 나는 현재 비슷한 일을하고 있지만 제대로 작동하지는 못하고있다. 내가 알아 낸 것은 MPMoviePlayerController가 내 사용자 지정 NSURLProtocol 하위 클래스와 상호 작용하지만, MPMoviePlayerController에 필요한 바이트 범위를 정의하기 때문에 NSURLRequest의 HTTPHeaders를 고려하는 것이 중요해 보입니다. 당신이 당신의 NSURLProtocol 서브 클래스에서 그들을 덤프 경우

당신은 시작 두 번 같은 것을 얻을 것이다 :

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

을}

그래서 내 생각만큼 올바른 범위를 제공 할 수 있다는 것입니다 가능한 MPMoviePlayerController가 재생할 수있는 mp4 파일을 반환하십시오!

편집 : Protecting resources in iPhone and iPad apps

+0

나는 플레이어가 URL을 구문 분석하는 방법을 찾은 것처럼 플레이어가 파싱 URL을 필요로한다는 것을 알아 냈습니다. 그러나 사과가 우리에게 제공하지는 않습니다. – ben

+0

NSURLProtocol에 범위가있는이 사용자 정의 시작로드가 포함 된 메서드가 표시되지 않습니다. 아마도 개인적인 방법 일 겁니다. 누구든지 이것에 대한 단서가 있습니까? – BadPirate

+0

NSURLProtocol 하위 클래스의 startLoading 메서드에서 호출 NSDictionary * headers = [self.request allHTTPHeaderFields]; if ([[headers allKeys] containsObject : @ "Range"]) \t { \t \t NSLog (@ "Range : % @", [headers objectForKey : @ "Range"]); \t} –

6

이 솔루션은 프록시 요청에 로컬 HTTP 서버를 통해 : 여기에 흥미로운 링크입니다. 나는 CocoaHTTPServer을 사용하여 이것을 수행했다.

HTTPAsyncFileResponse 예제를 살펴보십시오.

+0

스트리밍 비디오 용 로컬 서버를 구현할 예정입니다. 하지만 어떻게 시작 해야할지 모르겠다. (당신이 내게 그것을 만드는 방법을 공유 할 수 있습니다. 고마워요. – sahara108

+0

AVAssetResourceLoader 접근 방식을 시도하고 작동하도록 얻을 수 없습니다. 뭔가 간단한 작업을 너무 많이 보입니다. AVPlayer URL 요청의 사용자 정의 헤더) .CocoaHTTPServer를 사용하여 구현하는 방법에 대한 지침을 제공 할 수 있습니까? – mixtly87

5

iOS 7부터 한 가지 솔루션이 더 있습니다. AVAssetResourceLoader에 AVAssetResourceLoaderDelegate를 사용할 수 있습니다. 그러나 이것은 AVPlayer에서만 작동합니다.

사과에 의한 AVARLDelegateDemo라는 데모 프로젝트가 있습니다. 필요한 것을 찾아야합니다. (나는 그것에 연결하는 것은 좋은 생각이 아니므로 developer.apple.com의 개발자 라이브러리에서 검색하십시오.) 그런 다음 NSURLProtocol을 선언하지 않고 모든 사용자 정의 URL 스킴을 사용하고 AVAssetResourceLoaderDelegate에서 해당 URL 스킴을 처리하십시오.

큰 관심이있는 경우 개념 증명의 증거를 제공 할 수 있습니다. 더미 URL의 사용

+1

이것을 iOS8 AVPlayerViewController와 결합하면 이것이 내가 찾은 최상의 솔루션입니다. –

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

공지 URL을 직접 액세스하는 대신 AVAssetResourceLoaderDelegate 방법을 사용 AVPlayer을 강제로.

관련 문제