从AVFrame数据中获取单个缓冲区,并将其显示在Android Bitmap/Surface/SurfaceView上

从AVFrame数据中获取单个缓冲区,并将其显示在Android Bitmap/Surface/SurfaceView上,android,ffmpeg,android-ndk,Android,Ffmpeg,Android Ndk,我已经从avcodec_decode_VIDEO 2函数(FFmpeg)解码了AVFrame,然后将其传递到SWS库,并从YUV420P格式转换为RGB565。如何将所有颜色和线条信息,即帧->数据[0..3],帧->线条[0..3]组合到一个缓冲区中,以及如何在Android设备上显示它,例如使用Android位图或SurfaceView/View?我不想使用SurfaceFlinger,因为它不是NDK的官方部分,并且每一次小版本都会发生更改。您只有RGB的数据[0],如果您的帧是标准大小,

我已经从avcodec_decode_VIDEO 2函数(FFmpeg)解码了AVFrame,然后将其传递到SWS库,并从YUV420P格式转换为RGB565。如何将所有颜色和线条信息,即帧->数据[0..3],帧->线条[0..3]组合到一个缓冲区中,以及如何在Android设备上显示它,例如使用Android位图或SurfaceView/View?我不想使用SurfaceFlinger,因为它不是NDK的官方部分,并且每一次小版本都会发生更改。

您只有RGB的数据[0],如果您的帧是标准大小,则linesize[0]等于宽度。

问题是我已经尝试过了,即使用数据[0]&linesize[0],并且它适用于测试MPEG4文件,但它不适用于H.264-我只得到第一帧,然后什么都没有,视频被冻结,或者(大多数时候)我什么都没有得到。如果你在第一帧之后没有得到帧,我无法理解它与sws和位图渲染的关系。是你的解码器卡住了吗?看,我正在使用SDL_纹理和SDL_渲染来实际显示解码后的图像-忘了在前面的评论中提到这一点,但这种方法非常棘手,这就是为什么我问如何使用位图/曲面来显示它。解码器配置正确,正如我所说,它对MPEG4非常有效,但对于H.264编码的高清视频,它要么解码前几帧,要么根本不解码任何内容。你知道我应该往哪个方向挖吗?可能我需要更改编解码器初始化中的某些内容,以使此编码器正常工作?您的H.264流和/或解码器可能存在许多问题,但这些问题与原始问题无关:使用SWS库将YUV转换为RGB不会导致解码器帧松动。标准答案是首先尝试使用ffmpeg和ffplay命令行来验证流,如果输入正确,则发布初始化和使用解码器的方式。考虑到LIAAV-user@ffmpeg.org邮件列表。