2014-09-25 120 views

回答

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

对于进一步的细节:在WWDC 2014届513是非常丰富的。

+0

如下一个答案所示,此答案缺少一大堆所需的代码。事实上,这对任何人都不适用。 – 2016-07-30 18:43:49

+0

不仅代码丢失,而且错误。 CMSampleBuffer没有数据属性,所以sampleBuffer.data没有意义。 – 2016-08-14 21:53:45

+0

数据通过阅读视频的outVideo在第二个片段中提供。您应该首先观看WWDC会话513/2014 ... – Karsten 2016-08-15 07:01:12

2

我在尝试这个,但发现AVSampleBufferDisplay层没有图像。

我创建一个原始字节流的NAL单元并通过IDR和使用非IDR片:

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

有来自EnqueueSampleBuffer返回错误状态,因此可能很难找出它是怎么回事错误。

+0

有关详细信息,您最好从WWDC 2014结帐会话513。问题是如预期提供CMSampleBufferRef。 – Karsten 2014-09-26 07:46:03

+0

你可以看看我提供的源代码。 [看看](http://stackoverflow.com/questions/25980070/how-to-use-avsamplebufferdisplaylayer-in-ios-8-for-rtp-h264-streams-with-gstream) – Zappel 2014-10-29 18:47:30

+0

我有一些成功与AVSampleBufferDisplayLayer,有没有人经历过任何类型的播放抖动(通常当iFrame到达时)?我尝试过使用缓冲区来实现流畅播放,但没有取得太多成功。我也尝试在SampleBuffer中使用TimingInfo,让它在与“PresentationTimeStamp”相同的位置播放,同时将“ShouldDisplayImmediately”设置为false。 – Md1079 2014-11-07 10:41:26