【问题标题】:Get single buffer from AVFrame data and display it on Android Bitmap/Surface/SurfaceView从 AVFrame 数据中获取单个缓冲区并在 Android Bitmap/Surface/SurfaceView 上显示
【发布时间】:2011-11-13 20:06:28
【问题描述】:

我已经从 avcodec_decode_video2 函数 (FFmpeg) 解码了 AVFrame,然后将其传递给 SWS 库并从 YUV420P 格式转换为 RGB565。如何将所有颜色和线条尺寸信息(即 frame->data[0..3]、frame->linesize[0..3] )组合到一个缓冲区中,以及如何在 Android 设备上显示它,例如使用 Android Bitmap 或表面视图/视图?我不想使用 SurfaceFlinger,因为它不是 NDK 的官方部分,并且每个次要版本都会发生变化。

【问题讨论】:

    标签: android ffmpeg android-ndk


    【解决方案1】:

    你只有 RGB 的 data[0],如果你的框架是标准尺寸,linesize[0] 等于宽度。

    【讨论】:

    • 问题是我已经尝试过了,即使用 data[0] 和 linesize[0] 它适用于测试 MPEG4 文件,但它不适用于 H.264 - 我'我只得到第一帧然后什么都没有,视频被冻结或者(大多数时候)我什么都没有得到。
    • 如果在第一个之后没有得到帧,我无法理解它与sws和渲染到位图的关系。卡住的不是你解码器吗?
    • 看,我正在使用 SDL_Texture 和 SDL_Render 来实际显示解码后的图像 - 在之前的评论中忘记提及这一点,但这种方法非常棘手,这就是为什么我问它如何通过使用位图/表面。解码器配置正确,正如我所说,它非常适用于 MPEG4,但对于使用 H.264 编码的高清视频,它要么解码前几帧,要么根本不解码任何内容。你知道我应该朝哪个方向挖掘吗?也许我需要更改编解码器初始化中的某些内容才能使此编码器正常工作?
    • 您的 H.264 流和/或解码器可能存在许多问题,但这些问题与原始问题无关:使用 SWS 库将 YUV 转换为 RGB 不会导致解码器松散的框架。标准答案是首先尝试使用 ffmpeg 和 ffplay 命令行来验证您的流,并在输入正确的情况下发布您初始化和使用解码器的方式。考虑发布到 libav-user@ffmpeg.org 邮件列表。
    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多