2014-09-25 29 views

Odpowiedz

11

tutaj moje fragmenty kodu. Uznaniu jej

@property (nonatomic, retain) AVSampleBufferDisplayLayer *videoLayer; 

przy pierwszej konfiguracji warstwę wideo

self.videoLayer = [[AVSampleBufferDisplayLayer alloc] init]; 
self.videoLayer.bounds = self.bounds; 
self.videoLayer.position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 
self.videoLayer.videoGravity = AVLayerVideoGravityResizeAspect; 
self.videoLayer.backgroundColor = [[UIColor greenColor] CGColor]; 

//set Timebase 
CMTimebaseRef controlTimebase; 
CMTimebaseCreateWithMasterClock(CFAllocatorGetDefault(), CMClockGetHostTimeClock(), &controlTimebase); 

self.videoLayer.controlTimebase = controlTimebase; 
CMTimebaseSetTime(self.videoLayer.controlTimebase, CMTimeMake(5, 1)); 
CMTimebaseSetRate(self.videoLayer.controlTimebase, 1.0); 

// connecting the videolayer with the view 

[[self layer] addSublayer:_videoLayer]; 

dostarczanie danych wideo do warstwy

__block AVAssetReaderTrackOutput *outVideo = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:video outputSettings:dic]; 

if([assetReaderVideo startReading]) 
{ 
    [_videoLayer requestMediaDataWhenReadyOnQueue: assetQueue usingBlock: ^{ 
     while([_videoLayer isReadyForMoreMediaData]) 
     { 
      CMSampleBufferRef *sampleVideo = [outVideo copyNextSampleBuffer]; 

      [_videoLayer enqueueSampleBuffer:sampleVideo.data]; 
     } 
    }]; 
} 

Dalsze szczegóły: Session 513 w WWDC 2014 jest bardzo pouczające.

+0

W tej odpowiedzi brakuje wymaganego fragmentu kodu, zgodnie z kolejną odpowiedzią. W rzeczywistości nie byłoby to możliwe dla nikogo. –

+0

Nie tylko brakuje kodu, ale jest on nieprawidłowy. Nie ma właściwości data dla CMSampleBuffer, więc sampleBuffer.data nie ma sensu. –

+0

Dane są podawane w drugim fragmencie za pośrednictwem outVideo, który odczytuje wideo. Powinieneś najpierw obejrzeć sesję WWDC 513/2014 ... – Karsten

2

Próbuję to, ale stwierdzam, że nie ma obrazu na warstwie AVSampleBufferDisplay.

ja stworzyć NALUnits z surowego strumienia bajtów i przekazać IDR oraz plastry dla IDR za pomocą:

if ([avLayer isReadyForMoreMediaData]) { 
     [avLayer enqueueSampleBuffer:sampleBuffer]; 
} 

Nie ma status błędu zwrócony z EnqueueSampleBuffer więc może być trudne, aby dowiedzieć się, gdzie to się dzieje źle.

+0

Lepiej sprawdź ostatnią sesję 513 z WWDC 2014, aby poznać szczegóły. Problem polega na dostarczeniu CMSampleBufferRef zgodnie z oczekiwaniami. – Karsten

+0

Możesz rzucić okiem na podany kod źródłowy. [Spójrz] (http://stackoverflow.com/questions/25980070/how-to-use-avsamplebufferdisplaylayer-in-ios-8-for-rtp-h264-streams-with-gstream) – Zappel

+0

Odniosłem pewien sukces AVSampleBufferDisplayLayer, czy ktokolwiek doświadczył jakiegokolwiek jittera podczas odtwarzania (zazwyczaj, gdy przybywa iFrame)? Eksperymentowałem z buforami dla płynnego odtwarzania, ale nie osiągnąłem zbyt dużego sukcesu. Próbowałem również użyć TimingInfo w SampleBuffer, aby uruchomić go w tym samym momencie co PresentationTimeStamp, a ustawienie "ShouldDisplayImmediately" na false. – Md1079