Chcę podzielić się moją wiedzą, którą opracowałem w ciągu kilku dni na jej temat. Nie ma wiele do znalezienia.Jak wyświetla się AVSampleBufferDisplayLayer H.264
Nadal gramofuję się z dźwiękiem. Komentarze i wskazówki są mile widziane. ;-)
Chcę podzielić się moją wiedzą, którą opracowałem w ciągu kilku dni na jej temat. Nie ma wiele do znalezienia.Jak wyświetla się AVSampleBufferDisplayLayer H.264
Nadal gramofuję się z dźwiękiem. Komentarze i wskazówki są mile widziane. ;-)
tutaj moje fragmenty kodu. Uznaniu jej
@property (nonatomic, retain) AVSampleBufferDisplayLayer *videoLayer;
przy pierwszej konfiguracji warstwę wideo
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];
dostarczanie danych wideo do warstwy
__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];
}
}];
}
Dalsze szczegóły: Session 513 w WWDC 2014 jest bardzo pouczające.
Próbuję to, ale stwierdzam, że nie ma obrazu na warstwie AVSampleBufferDisplay.
ja stworzyć NALUnits z surowego strumienia bajtów i przekazać IDR oraz plastry dla IDR za pomocą:
if ([avLayer isReadyForMoreMediaData]) {
[avLayer enqueueSampleBuffer:sampleBuffer];
}
Nie ma status błędu zwrócony z EnqueueSampleBuffer więc może być trudne, aby dowiedzieć się, gdzie to się dzieje źle.
Lepiej sprawdź ostatnią sesję 513 z WWDC 2014, aby poznać szczegóły. Problem polega na dostarczeniu CMSampleBufferRef zgodnie z oczekiwaniami. – Karsten
Możesz rzucić okiem na podany kod źródłowy. [Spójrz] (http://stackoverflow.com/questions/25980070/how-to-use-avsamplebufferdisplaylayer-in-ios-8-for-rtp-h264-streams-with-gstream) – Zappel
Odniosłem pewien sukces AVSampleBufferDisplayLayer, czy ktokolwiek doświadczył jakiegokolwiek jittera podczas odtwarzania (zazwyczaj, gdy przybywa iFrame)? Eksperymentowałem z buforami dla płynnego odtwarzania, ale nie osiągnąłem zbyt dużego sukcesu. Próbowałem również użyć TimingInfo w SampleBuffer, aby uruchomić go w tym samym momencie co PresentationTimeStamp, a ustawienie "ShouldDisplayImmediately" na false. – Md1079
W tej odpowiedzi brakuje wymaganego fragmentu kodu, zgodnie z kolejną odpowiedzią. W rzeczywistości nie byłoby to możliwe dla nikogo. –
Nie tylko brakuje kodu, ale jest on nieprawidłowy. Nie ma właściwości data dla CMSampleBuffer, więc sampleBuffer.data nie ma sensu. –
Dane są podawane w drugim fragmencie za pośrednictwem outVideo, który odczytuje wideo. Powinieneś najpierw obejrzeć sesję WWDC 513/2014 ... – Karsten