Android MediaCodec可以用来解码输出的yuv420格式。我猜应该是NV12格式,但是当我在Nexus6 7.1.1设备上试用的时候。结果很奇怪:
>
对于720p视频,它工作良好,输出的yuv可以通过ffplay播放,使用以下命令:
ffplay-V信息-F rawvideo-PIXEL_FORMAT yuv420p-VIDEO_SIZE 1280x720 OUT.YUV
当试图解码它到表面,它看起来很好。所以我猜问题来自1080p YUV包仅。
对于1080p,很可能实际解码图片的高度是1920x1088,而不是1920x1080。(1920x1088加起来等于3133440。)最底部的8个像素被解码并返回,但你不应该显示它们。
在这种情况下,输出mediaformat
中的mediaformat.key_height
字段可能是1088,而crop-top
字段是0,而crop-bottom
是1079。有关如何读取这些字段的示例,请参见https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/encodedecodetest.java#976。
正如beetlej所建议的,如果您使用从MediaCodeC.getOutputImage
方法(自Android 5.0以来可用)接收到的Image
类,这些细节将得到处理。
“MediaCodec解码器可以使用上述格式之一或专有格式在字节缓冲区中产生数据。例如,基于Qualcomm SoC的设备通常使用OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m(#2141391876/0x7FA30C04)。” 为什么不使用统一的YUV格式?为什么有这么多的YUV颜色格式? @fadden,我发现有可能解码到Surface并获得RGB
我目前正在尝试开发一个Android上的视频播放器,但是在颜色格式上却很纠结。 上下文:我通过MediaExtractor/MediaCodec的标准组合来提取和解码视频。因为我需要提取的帧作为OpenGLES纹理(RGB)可用,所以我设置了解码器(MediaCodec),以便它通过SurfaceTexture提供外部GLES纹理(GL_TEXTURE_EXTERNAL_OES)。我知道我的HW解
大小范围在2.5MB-20MB之间。这个问题在较长的剪辑上变得更糟,例如7分钟的范围是9MB-120MB。 正常吗? 我试图捕捉同样的场景,但还是得到了不同的结果。
我正在尝试从解码的mp4缓冲区中获取PCM样本以进行进一步处理。我首先从使用手机的相机应用程序录制的视频文件中提取音轨,并且我已经确保在获得“音频/mp4”mime键时选择了音轨: 之后,我遍历轨道,向编解码器提供编码访问单元流,并将解码的访问单元拉入ByteBuffer(这是我从此处发布的视频渲染示例中回收的代码https://github.com/vecio/MediaCodecDemo):
最近,由于系统升级,我们将应用程序移植到Android L版本5.0.2。我的应用程序不能播放像720p@60fps和1080p@60fps这样的高分辨率视频。 同样,这是我关于stackoverflow的问题,请原谅我关于错误的代码格式和直接引用的问题。
我正在尝试用android低级媒体API实时解码h264 nals。 每个nal都包含一个完整的帧,所以我希望在用我的nal提供输入并调用之后,它会“立即”(当然有一个litle延迟)显示我的帧,但它没有显示。我看到了第一个帧,出列器返回第一个缓冲区,只有在将第二个缓冲区馈送给解码器之后才返回第一个缓冲区,此时该缓冲区应该呈现第二个帧。帧编码时预置为x264,因此没有B帧等。 我想可能有一种方法可