FFmpeg を使用してビデオ フレームをデコードし、それを iOS 5.0 の OpenGL ES で表示しようとした人はいますか?
Apple の GLCameraRipple の例を変更しようとしましたが、常に から -6683 エラーが発生しCVOpenGLESTextureCacheCreateTextureFromImage()
ます。
ここに私のデコードコードがあります:
...
convertCtx = sws_getContext(codecCtx->width, codecCtx->height, codecCtx->pix_fmt,
codecCtx->width, codecCtx->height, PIX_FMT_NV12,
SWS_FAST_BILINEAR, NULL, NULL, NULL);
srcFrame = avcodec_alloc_frame();
dstFrame = avcodec_alloc_frame();
width = codecCtx->width;
height = codecCtx->height;
outputBufLength = avpicture_get_size(PIX_FMT_NV12, width, height);
outputBuf = malloc(outputBufLength);
avpicture_fill((AVPicture *)dstFrame, outputBuf, PIX_FMT_NV12, width, height);
...
avcodec_decode_video2(codecCtx, srcFrame, &gotFrame, pkt);
...
sws_scale(convertCtx,
(const uint8_t**)srcFrame->data, srcFrame->linesize,
0, codecCtx->height,
dstFrame->data, dstFrame->linesize);
表示用のコードは次のとおりです。
CVPixelBufferRef pixelBuffer;
CVPixelBufferCreateWithBytes(kCFAllocatorDefault, [videoDecoder width], [videoDecoder height],
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
dstFrame->data[0], dstFrame->linesize[0], 0, 0, 0,
&pixelBuffer);
...
CVReturn err;
int textureWidth = CVPixelBufferGetWidth(pixelBuffer);
int textureHeight = CVPixelBufferGetHeight(pixelBuffer);
if (!videoTextureCache)
{
NSLog(@"No video Texture cache");
}
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
// Y-plane
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RED_EXT,
textureWidth,
textureHeight,
GL_RED_EXT,
GL_UNSIGNED_BYTE,
0,
&lumaTexture);
if (err)
{
NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
}
glBindTexture(CVOpenGLESTextureGetTarget(lumaTexture), CVOpenGLESTextureGetName(lumaTexture));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// UV-plane
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RG_EXT,
textureWidth / 2,
textureHeight / 2,
GL_RG_EXT,
GL_UNSIGNED_BYTE,
1,
&chromaTexture);
if (err)
{
NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
}
glBindTexture(CVOpenGLESTextureGetTarget(chromaTexture), CVOpenGLESTextureGetName(chromaTexture));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
コードが完全ではないことはわかっていますが、問題を理解するには十分なはずです。
誰かが私を助けてくれますか、このアプローチでいくつかの実例を見せてくれますか?