2014-03-06 7 views
1

avplayer를 사용하여 OSX가 설치된 n HTTP 라이브 스트리밍 플레이어를 구현하고 있습니다. 동영상을 제대로 검색하고 재생 시간을 확인할 수 있습니다. 이제는 OpenCV를 사용하여 스크린 샷을 찍어서 프레임을 처리하고 싶습니다. AVASSetImageGenerator를 사용하려고했습니다. 그러나 player.currentItem과 관련된 AVAsset이있는 오디오 및 비디오 트랙은 없습니다.HTTP 라이브 스트림 AVAsset

트랙이 player.currentItem.tracks에 표시됩니다. 그래서 AVAssetGenerator를 고소 할 수 없습니다. 이러한 시나리오에서 스크린 샷과 개별 프레임을 추출하는 솔루션을 찾는 데 도움을 줄 수 있습니까?

것은 내가 사전에 라이브 스트림에게 HTTP를

감사를 시작하고 방법을 아래의 코드를 찾아주세요.

NSURL* url = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]; 
playeritem = [AVPlayerItem playerItemWithURL:url]; 

[playeritem addObserver:self forKeyPath:@"status" options:0 context:AVSPPlayerStatusContext]; 
[self setPlayer:[AVPlayer playerWithPlayerItem:playeritem]]; 
[self addObserver:self forKeyPath:@"player.rate" options:NSKeyValueObservingOptionNew context:AVSPPlayerRateContext]; 
[self addObserver:self forKeyPath:@"player.currentItem.status" options:NSKeyValueObservingOptionNew context:AVSPPlayerItemStatusContext]; 
AVPlayerLayer *newPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:[self player]]; 
[newPlayerLayer setFrame:[[[self playerView] layer] bounds]]; 
[newPlayerLayer setAutoresizingMask:kCALayerWidthSizable | kCALayerHeightSizable]; 
[newPlayerLayer setHidden:YES]; 
[[[self playerView] layer] addSublayer:newPlayerLayer]; 
[self setPlayerLayer:newPlayerLayer]; 
[self addObserver:self forKeyPath:@"playerLayer.readyForDisplay" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVSPPlayerLayerReadyForDisplay]; 
[self.player play];  

난 비디오 트랙이 자산

case AVPlayerItemStatusReadyToPlay: 

       [self setTimeObserverToken:[[self player] addPeriodicTimeObserverForInterval:CMTimeMake(1, 10) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) { 
        [[self timeSlider] setDoubleValue:CMTimeGetSeconds(time)]; 
        NSLog(@"%f,%f,%f",[self currentTime],[self duration],[[self player] rate]); 
        AVPlayerItem *item = playeritem; 
        if(item.status == AVPlayerItemStatusReadyToPlay) 
        { 
        AVAsset *asset = (AVAsset *)item.asset; 
        long audiotracks = [[asset tracks] count]; 
        long videotracks = [[asset availableMediaCharacteristicsWithMediaSelectionOptions]count]; 

        NSLog(@"Track info Audio = %ld,Video=%ld",audiotracks,videotracks); 
        } 
       }]]; 



       AVPlayerItem *item = self.player.currentItem; 
       if(item.status != AVPlayerItemStatusReadyToPlay) 
        return; 
       AVURLAsset *asset = (AVURLAsset *)item.asset; 
       long audiotracks = [[asset tracksWithMediaType:AVMediaTypeAudio]count]; 
       long videotracks = [[asset tracksWithMediaType:AVMediaTypeVideo]count]; 

       NSLog(@"Track info Audio = %ld,Video=%ld",audiotracks,videotracks); 
+1

안녕하세요, 어떻게 HLS를 사용하여 트랙을 관리하셨습니까? 제발 도와주세요 –

답변

1

이 오래된 질문이지만, 경우에 누군가가 내가 대답을 그것을 위해 도움을 필요로하는 존재 여부를 확인하고 어떻게되어 다음

AVURLAsset *asset = /* Your Asset here! */; 
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
generator.requestedTimeToleranceAfter = kCMTimeZero; 
generator.requestedTimeToleranceBefore = kCMTimeZero; 
for (Float64 i = 0; i < CMTimeGetSeconds(asset.duration) * /* Put the FPS of the source video here */ ; i++){ 
    @autoreleasepool { 
     CMTime time = CMTimeMake(i, /* Put the FPS of the source video here */); 

     NSError *err; 
     CMTime actualTime; 
     CGImageRef image = [generator copyCGImageAtTime:time actualTime:&actualTime error:&err]; 

     // Do what you want with the image, for example save it as UIImage 
     UIImage *generatedImage = [[UIImage alloc] initWithCGImage:image]; 

     CGImageRelease(image); 
    } 
} 

다음 코드를 사용하여 비디오의 FPS를 쉽게 얻을 수 있습니다.

float fps=0.00; 
if (asset) { 
    AVAssetTrack * videoATrack = [asset tracksWithMediaType:AVMediaTypeVideo][0]; 
    if(videoATrack) 
    { 
     fps = [videoATrack nominalFrameRate]; 
    } 
} 

비디오에서 모든 프레임을 가져 오는 방법이나 특정 (예 : CMTime으로) 프레임을 가져 오는 방법을 묻는 사람에게 도움이되는 호프입니다. 모든 프레임을 배열에 저장하면 메모리에 거의 영향을 미치지 않을 수 있습니다.

+0

그것을 사랑해. 나는 2016 년에 이곳에 왔고이 대답을 필요로했다. 감사! – sudo