2014-09-25 2 views
8

Я хочу поделиться своими знаниями, которые я разработал в некоторые дни об этом. Существует не так много, чтобы найти об этом.Как отображает AVSampleBufferDisplayLayer H.264

Я все еще fizzeling о звуке. Комментарии и советы приветствуются. ;-)

ответ

11

здесь мои фрагменты кода. Объявим его

@property (nonatomic, retain) AVSampleBufferDisplayLayer *videoLayer; 

при первоначальной настройке видео слой

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

обеспечивая видеоданные к слою

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

Для получения более подробной информации: Сессия 513 в WWDC 2014 является очень информативным.

+0

В этом ответе отсутствует нужный код, как указано в следующем ответе. Как бы то ни было, это не сработает. –

+0

Не хватает кода, но это неправильно. Для CMSampleBuffer нет свойства данных, поэтому sampleBuffer.data не имеет смысла. –

+0

Данные предоставляются во втором фрагменте через outVideo, который читает видео. Вы должны сначала посмотреть сессию WWDC 513/2014 ... – Karsten

2

Я пытаюсь это, но обнаруживаю, что на уровне AVSampleBufferDisplay нет изображения.

я создаю NALUnits из сырьевого потока байт и передать IDR и Non-IDR ломтик с помощью:

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

Там нет статуса ошибки, возвращаемого из EnqueueSampleBuffer так может быть трудно выяснить, где она собирается неправильно.

+0

Для получения более подробной информации вы можете проверить сеанс 513 от WWDC 2014. Проблема заключается в предоставлении CMSampleBufferRef, как ожидалось. – Karsten

+0

Вы можете посмотреть исходный код, который я предоставил. [Взгляните] (http://stackoverflow.com/questions/25980070/how-to-use-avsamplebufferdisplaylayer-in-ios-8-for-rtp-h264-streams-with-gstream) – Zappel

+0

У меня был некоторый успех с AVSampleBufferDisplayLayer, кто-нибудь испытал какой-либо джиттер в воспроизведении (обычно, когда iFrame прибывает)? Я экспериментировал с буферами для плавного воспроизведения, но не имел слишком большого успеха. Я также попытался использовать TimingInfo в SampleBuffer, чтобы заставить его играть в той же точке, что и PresentationTimeStamp при установке «ShouldDisplayImmediately» на false. – Md1079

Смежные вопросы