/ / Como AVSampleBufferDisplayLayer exibe H.264 - ios, streaming de vídeo, h.264

Como o AVSampleBufferDisplayLayer exibe o H.264 - ios, streaming de vídeo, h.264

Quero compartilhar meu conhecimento, que trabalhei em alguns dias sobre isso. Não há muito o que descobrir sobre isso.

Ainda estou fracassando com o som. Comentários e dicas são bem-vindos. ;-)

Respostas:

12 para resposta № 1

aqui meus trechos de código. Declare

@property (nonatomic, retain) AVSampleBufferDisplayLayer *videoLayer;

na primeira configuração da camada de vídeo

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

fornecendo os dados de vídeo para a camada

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

Para mais detalhes: a Sessão 513 na WWDC 2014 é muito informativa.


2 para resposta № 2

Estou tentando isso, mas acho que não há imagem na camada AVSampleBufferDisplay.

Crio as NALUnits a partir de um fluxo de bytes brutos e passo as fatias IDR e Não-IDR usando:

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

Não há status de erro retornado do EnqueueSampleBuffer; portanto, pode ser difícil descobrir onde está errado.