Я хочу поделиться своими знаниями, которые я разработал в некоторые дни об этом. Существует не так много, чтобы найти об этом.Как отображает AVSampleBufferDisplayLayer H.264
Я все еще fizzeling о звуке. Комментарии и советы приветствуются. ;-)
Я хочу поделиться своими знаниями, которые я разработал в некоторые дни об этом. Существует не так много, чтобы найти об этом.Как отображает AVSampleBufferDisplayLayer H.264
Я все еще fizzeling о звуке. Комментарии и советы приветствуются. ;-)
здесь мои фрагменты кода. Объявим его
@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 является очень информативным.
Я пытаюсь это, но обнаруживаю, что на уровне AVSampleBufferDisplay нет изображения.
я создаю NALUnits из сырьевого потока байт и передать IDR и Non-IDR ломтик с помощью:
if ([avLayer isReadyForMoreMediaData]) {
[avLayer enqueueSampleBuffer:sampleBuffer];
}
Там нет статуса ошибки, возвращаемого из EnqueueSampleBuffer так может быть трудно выяснить, где она собирается неправильно.
Для получения более подробной информации вы можете проверить сеанс 513 от WWDC 2014. Проблема заключается в предоставлении CMSampleBufferRef, как ожидалось. – Karsten
Вы можете посмотреть исходный код, который я предоставил. [Взгляните] (http://stackoverflow.com/questions/25980070/how-to-use-avsamplebufferdisplaylayer-in-ios-8-for-rtp-h264-streams-with-gstream) – Zappel
У меня был некоторый успех с AVSampleBufferDisplayLayer, кто-нибудь испытал какой-либо джиттер в воспроизведении (обычно, когда iFrame прибывает)? Я экспериментировал с буферами для плавного воспроизведения, но не имел слишком большого успеха. Я также попытался использовать TimingInfo в SampleBuffer, чтобы заставить его играть в той же точке, что и PresentationTimeStamp при установке «ShouldDisplayImmediately» на false. – Md1079
В этом ответе отсутствует нужный код, как указано в следующем ответе. Как бы то ни было, это не сработает. –
Не хватает кода, но это неправильно. Для CMSampleBuffer нет свойства данных, поэтому sampleBuffer.data не имеет смысла. –
Данные предоставляются во втором фрагменте через outVideo, который читает видео. Вы должны сначала посмотреть сессию WWDC 513/2014 ... – Karsten