QTMovieLayer具有非零“内容”的iOS替代品?
背景
QTKit(QuickTime Kit)是10.3版本的Mac框架,它在10.5中增加了一些图层,例如QTMovieLayer
。 QTMovieLayer的好处之一是可以使用图层上的常规content
属性访问电影内容,并获取CAImageQueue
对象。 与此相关的CALayer
是,您可以创build一堆常规CALayer
,并将图像队列设置为其内容,并通过设置正确的contentRect
将所有图层设置为电影的一部分。 这意味着您可以创build类似下面的图像,只有一个电影正在运行,同时获得同步和内存效率。
我可以发布这个代码,但我怀疑这是相关的我的问题,因为问题是关于iOS和QTKit不存在那里。
我的问题
我想在iOS上做同样的事情,但QTKit不存在。 也就是说,我正在寻找iOS 中存在的QTMovieLayer的替代scheme, 其中content
属性不是零 (这是重要的部分),以便我可以在多个图层之间共享内容。
另外,当我设法让video在多个层次上播放时,我希望能够指定video的哪一部分应该在哪一层中播放(如上图所示)
我试过了
在iOS上,您可以使用AVFoundation或MediaPlayer框架来播放电影。 在AVFoundation你有AVPlayerLayer
可以显示电影。 (您也有AVCaptureVideoPreviewLayer
用于显示相机input的预览, AVSynchronizedLayer
用于同步但不显示video)。
注意: 在所有这些例子中,我成功地让video在声音和所有东西的层中播放。 那不是我的问题。 问题是我无法获取内容与其他图层共享。
我已阅读技术说明TN2300 – 将QTKit代码转换为AV Foundation,但无法find有关在图层之间共享video内容的任何内容。
AVPlayerLayer
如果我创build一个这样的播放器图层,并尝试获取contents
我只能回nil
NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"video" withExtension:@"m4v"]; AVPlayer *player = [AVPlayer playerWithURL:videoURL]; [player play]; AVPlayerLayer *videoLayer = [AVPlayerLayer playerLayerWithPlayer:player]; id videoContent = videoLayer.contents // <-- this is nil :(
AVCaptureVideoPreviewLayer
即使我真的有兴趣回放一个电影文件我尝试使用捕捉预览图层,但内容是零
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; AVCaptureSession *captureSession = [AVCaptureSession new]; [captureSession addInput:input]; AVCaptureVideoPreviewLayer *Layer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; [captureSession startRunning]; id videoContent = videoLayer.contents // <-- this is still nil :(
AVSynchronizedLayer
从它的名字你可能会认为同步层将是我正在寻找,但它不是用来显示任何东西(表头文件):
AVSynchronizedLayer类似于CATransformLayer,因为它本身不显示任何东西,只是在其子层上赋予状态。
MediaPlayer框架
媒体播放器框架没有图层变体,创build播放器视图控制器,获取播放器视图层看起来对我来说不是一个有效的select。 (是的,我甚至懒得去试试。)
问题的回顾:
QTMovieLayer是否存在于iOS上,您可以在其中获取当前正在播放的video的内容,并同时在多个其他图层中显示其部分内容?
为了从捕捉会话或玩家会话获得video/audio数据缓冲区,
- 创buildAVCaptureVideoDataOutput / AVCaptureAudioDataOutput对象。
- 确认你的一个AVCaptureVideoDataOutputSampleBufferDelegate。
- 将AVCaptureVideoDataOutput添加到您的Capture / Player会话。
- 实施协议方法。 在AVCaptureVideoDataOutputSampleBufferDelegate的captureOutput …方法中捕获/播放媒体时,您将收到包含video/audio帧的CMSampleBufferRef对象。
CMSampleBufferRef对象包含媒体框架数据,时间戳记信息和媒体的格式描述。 然后可以通过将其转换为CGImageRef并将其显示在任何视图上来显示此帧。
您还可以在AVCaptureVideoDataOutput.videoSettings属性中指定所需的帧压缩格式(或未压缩的帧格式)。
- AVFoundation,如何captureStillImageAsynchronouslyFromConnectionclosures快门声音?
- 简单的屏幕截图:只logging在UIView的图层内出现的video?
- 添加AVMutableVideoComposition的文本覆盖到特定的时间范围
- 在locking屏幕上设置和访问iOS查找栏
- ios AVCaptureVideoPreviewLayer捕获当前图像
- animationAVPlayerLayer videoGravity属性
- 如何使用AVCapturePhotoOutput
- didOutputSampleBuffer委托没有被调用
- AVAssetWriter可以使用透明度编写文件吗?