/ / Ako AVSampleBufferDisplayLayer zobrazuje H.264 - ios, streamovanie videa, h.264

Ako AVSampleBufferDisplayLayer zobrazuje H.264 - ios, streamovanie videa, h.264

Chcem sa podeliť o svoje vedomosti, ktoré som o nich vypracoval v niektorých dňoch. O tom nie je veľa čo hľadať.

Stále zvuujem o zvuku. Komentáre a tipy sú vítané. ;-)

odpovede:

12 pre odpoveď č. 1

tu moje útržky kódu. Vyhlásiť to

@property (nonatomic, retain) AVSampleBufferDisplayLayer *videoLayer;

najprv nastavte vrstvu videa

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

poskytovanie video dát do vrstvy

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

Ďalšie podrobnosti: Session 513 v WWDC 2014 je veľmi informatívny.


2 pre odpoveď č. 2

Pokúšam sa o to, ale zistím, že na vrstve AVSampleBufferDisplay nie je žiadny obraz.

Vytváram NALUnits zo surového bajtového toku a odovzdávam rezy IDR a Non-IDR pomocou:

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

EnqueueSampleBuffer nevrátil žiadny chybový stav, takže môže byť ťažké zistiť, kde sa vyskytuje chyba.