3

iOS 6.1 で CADisplayLink と AVPlayerItemVideoOutput があります。現在、CVPixelBufferRef があり、それを変更したいと考えています (たとえば、ビデオにタイムコードを表示するなど)。変更部分が正しく実装され、新しいフレームで CGImageRef または CGContextRef が作成されたと思います。

今の私の質問: どのように表示すればよいですか? OS X 用の特別なクラスは見つかりましたが、iOS 用のクラスはありませんでした。いずれかがあります?GPUImage フレームワークをショートカットとして使用できますか? (しかし、専用の GPUImage ムービー プレーヤーはオーディオを行いません :( )。

( Advanced 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 には公開されているものはありません :/ )。

4

1 に答える 1