如何显示[AVPlayerItemVideoOutput copyPixelBufferForItemTime:]的结果?

时间:2013-05-03 09:19:59

标签: objective-c ios6 avfoundation

我在iOS 6.1下有一个CADisplayLink和一个AVPlayerItemVideoOutput。我现在有一个CVPixelBufferRef并想要修改它(例如在视频上显示时间码等)。我想我已经正确实现了修改部分,现在有一个CGImageRef或带有新框架的CGContextRef。

我现在的问题:我该怎么表现出来?我找到了OS X的特殊类,但是iOS没有。有吗?我可以使用GPUImage Framework作为快捷方式吗? (但专用的GPUImage电影播放器​​不会播放音频:()。

(有没有高级AVFoundation的好书?)

这是我的代码,但是视频上没有显示绘制的文本(视频和音频播放效果很好)。代码通过CADisplayLink Callback调用(我检查过)。

CVPixelBufferRef ref = [_playerItemVideoOutput copyPixelBufferForItemTime:_playerItem.currentTime itemTimeForDisplay:nil];
size_t width = CVPixelBufferGetWidth(ref);
size_t height = CVPixelBufferGetHeight(ref);
size_t bytes_per_row = CVPixelBufferGetBytesPerRow(ref);

CVPixelBufferLockBaseAddress(ref, 0);
void *pxdata = CVPixelBufferGetBaseAddress(ref);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pxdata, width,
        height, 8, bytes_per_row, rgbColorSpace, kCGImageAlphaNoneSkipFirst);
CGContextRetain(context);

CGContextSelectFont(context, "Helvetica", 10, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextShowTextAtPoint(context, 0.0, 0.0, "O BROTHER WHERE ARE THOU?", 20);

CGColorSpaceRelease(rgbColorSpace);
CVPixelBufferUnlockBaseAddress(ref, 0);
CGContextRelease(context);
CVBufferRelease(ref);

编辑: 我的问题是,您无法使用AVPlayerLayer显示修改后的像素缓冲区。你必须通过其他方法输出它(在Mac上有一个AVSampleBufferOutput,但在iOS上没有公开的等价物:/)。

1 个答案:

答案 0 :(得分:3)

我想你问的是错误的问题。您似乎想要实时处理视频,但后来询问CGImageRef

我建议你学习 Session 517 of WWDC 2012 。有sample code for OSX and iOS,下载所有[相关] AVFoundation样本并检查出来。搜索新的iOS 6方法以缩小您的任务范围。

一旦你有了代码(基本上是CADisplayLink回调,你将在适当的时间用copyPixelBufferForItemTime:itemTimeForDisplay:提取像素缓冲区)你可以用GPUImage,Core Image或者只修改像素缓冲区你自己的OpenGL代码。当视频即将在AVPlayer中播放时,所有这一切都必须完成,否则您将只能显示图像而不能显示音频。至少没有同步音频。

如果你问一些具体的话,我可以帮你更多。