0

我试图分别获取 Y、U、V 值,以便将它们传递给 openGL 并映射到纹理。我知道这些值可以在 AVPicture.data[0] (Y) 和 AVPicture.data[1] (U) 和 AVPicture.data[2] (V) 中找到

avcodec_decode_video2(ctx, frame, &frameFinished, packet_data->packet);
AVPicture _avPicture;
picSize = avpicture_get_size(ctx->pix_fmt, ctx->width, ctx->height);
avpicture_alloc(&_avPicture, ctx->pix_fmt,ctx->width, ctx->height );
avpicture_fill(&_avPicture, packet_data->packet, ctx->pix_fmt,ctx->width,ctx->height);

^^ 那工作得很好。我遇到的问题是通过 JNI 将 Y、U、V 值传递回 Java。我必须知道 AVPicture.data[x] 指针指向的数据的大小。我试过 AVPicture.linesize 无济于事,以及:

           for (y = 0; y < ctx->height; y++){
                for (x = 0; x < ctx->width; x++){
                    yDataSize++;
                }
            }
            /* Cb and Cr */
            for (y = 0; y < ctx->height / 2; y++) {
                for (x = 0; x < ctx->width / 2; x++) {
                    uDataSize++;
                    vDataSize++;
                }
            }

我真的卡住了,谢谢!

4

1 回答 1

1

缓冲区大小是行大小乘以高度(行大小是每行的字节数,乘以行数得到总数)。所以_avPicture.linesize[x] * ctx->height。在 C++ 端计算,将值传回给 Java。

于 2013-08-13T18:08:47.577 回答