试了一下链接的方法。发现播放的时候会模糊。
所以还是使用libyuv库进行转换
//设置缓冲区的属性(宽、高、像素格式)
ANativeWindow_setBuffersGeometry(player->nativeWindow, codec_ctx->width, codec_ctx->height,WINDOW_FORMAT_RGBA_8888);
ANativeWindow_lock(nativeWindow,&outBuffer,NULL);
//设置rgb_frame的属性(像素格式、宽高)和缓冲区
//rgb_frame缓冲区与outBuffer.bits是同一块内存
avpicture_fill((AVPicture *)rgb_frame, (const uint8_t *) outBuffer.bits, AV_PIX_FMT_RGBA, codec_ctx->width, codec_ctx->height);
//YUV->RGBA_8888
libyuv::I420ToARGB(yuv_frame->data[0],yuv_frame->linesize[0],
yuv_frame->data[2],yuv_frame->linesize[2],
yuv_frame->data[1],yuv_frame->linesize[1],
rgb_frame->data[0], rgb_frame->linesize[0],
codec_ctx->width,codec_ctx->height);
//unlock
ANativeWindow_unlockAndPost(nativeWindow);
占用内存比第一行链接内的低。
硬解由于安卓碎片化,部分机子容易出现有声音没画面。
但是硬解比较省电,还是有必要去学习的。学习线索:OpenGL + EGL
一加6的相机录制的视频帧格式是12。
一些mp4播放不出来,是帧格式不对,调用其他格式API转成RGBA就行。example:I422ToARGB、I444ToARGB
So文件以及头文件待后面上传(arm-v8a架构)。链接