我尝试解码视频并将帧转换为rgb32或gb565le格式。
然后由JNI将此帧从C传递到Android缓冲区。
到目前为止,我知道如何将缓冲区从C传递到Android以及如何解码视频和获取解码帧。
我的问题是如何将解码后的帧转换为rgb32(或rgb565le)以及它存储在哪里?
以下是我的代码,我不确定是否正确。
-Jargo
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, 100, 100, PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);
if(!img_convert_ctx) return -6;
while(av_read_frame(pFormatCtx, &packet) >= 0) {
// Is this a packet from the video stream?
if(packet.stream_index == videoStream) {
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
// Did we get a video frame?
if(frameFinished) {
AVPicture pict;
if(avpicture_alloc(&pict, PIX_FMT_RGB32, 100, 100) >= 0) {
sws_scale(img_convert_ctx, (const uint8_t * const *)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pict.data, pict.linesize);
}
} // End of if( frameFinished )
} // End of if( packet.stream_index == videoStream )
// Free the packet that was allocated by av_read_frame
av_free_packet(&packet);
}
答案 0 :(得分:0)
解码后的帧进入pict
。 (pFrame
是一个原始框架。)
100x100
可能无法根据pFrame大小计算pict
大小。
我想它应该是pFrame->width*pFrame->height*32;
您必须自己分配pict
。