2014-09-25 11 views

risposta

11

qui il mio frammento di codice. Dichiararla

@property (nonatomic, retain) AVSampleBufferDisplayLayer *videoLayer; 

in un primo momento di impostazione del livello video

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

fornire i dati video per lo strato di

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

Per ulteriori dettagli: la Sessione 513 nel WWDC 2014 è molto istruttiva.

+0

In questa risposta manca una porzione di codice necessaria, come indicato dalla risposta successiva. Così com'è, questo non funzionerebbe per nessuno. –

+0

Non solo manca il codice, ma è sbagliato. Non esiste una proprietà data per CMSampleBuffer, quindi sampleBuffer.data non ha senso. –

+0

I dati sono forniti nel secondo snippet tramite l'outVideo che sta leggendo il video. È necessario guardare prima la sessione WWDC 513/2014 ... – Karsten

2

Sto tentando di farlo ma trovo che non ci sono immagini sul livello AVSampleBufferDisplay.

creo i NALUnits da un flusso di byte crudo e passare l'IDR e fette non IDR utilizzando:

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

Non c'è stato di errore tornato da EnqueueSampleBuffer quindi può essere difficile scoprire dove sta andando sbagliato.

+0

È meglio controllare la sessione 513 del WWDC 2014 per i dettagli. Il problema è di fornire CMSampleBufferRef come previsto. – Karsten

+0

Puoi dare un'occhiata al codice sorgente che ho fornito. [Date un'occhiata] (http://stackoverflow.com/questions/25980070/how-to-use-avsamplebufferdisplaylayer-in-ios-8-for-rtp-h264-streams-with-gstream) – Zappel

+0

Ho avuto qualche successo con AVSampleBufferDisplayLayer, qualcuno ha mai sperimentato alcun tipo di jitter durante la riproduzione (di solito quando arriva un iFrame)? Ho sperimentato con i buffer per una riproduzione fluida ma non ho avuto troppo successo. Ho anche provato a usare TimingInfo nel SampleBuffer per farlo suonare allo stesso punto del PresentationTimeStamp mentre si imposta 'ShouldDisplayImmediately' su false. – Md1079

Problemi correlati