我正在使用Android MediaCodec库来解码存储在文件系统上的视频。我得到一个看起来合法的输出缓冲区(正确的bufferinfo.offset
和size
)。它的格式似乎是256(这是JPEG)。我试图用BitmapFactory.decodeByteArray
解码它,但结果是null
。解码来自MediaCodec的输出缓冲区
有谁知道确定输出缓冲区格式的正确方法吗?什么是开始解码输出字节数组的正确方法?
我正在使用Android MediaCodec库来解码存储在文件系统上的视频。我得到一个看起来合法的输出缓冲区(正确的bufferinfo.offset
和size
)。它的格式似乎是256(这是JPEG)。我试图用BitmapFactory.decodeByteArray
解码它,但结果是null
。解码来自MediaCodec的输出缓冲区
有谁知道确定输出缓冲区格式的正确方法吗?什么是开始解码输出字节数组的正确方法?
MediaCodec
颜色格式由MediaCodecInfo.CodecCapabilities类定义。 256在内部使用,通常并不意味着您有一个JPEG数据的缓冲区。这里的混淆可能是因为你正在查看ImageFormat
类中的常量,但这些仅适用于相机输出。 (例如,ImageFormat.NV16
是YCbCr格式,而COLOR_Format32bitARGB8888
是RGB,但两者都具有数字值16)
,可以发现hereMediaCodec
使用的一些例子,包括链接到锻炼MediaCodec
CTS测试。在某些设备上,您将无法解码来自ByteBuffer
输出的数据,而必须解码为Surface
。
我其实已经想出了一点点。 MediaCodec有一个名为“输出格式改变”的“事件”。在这里,您可以访问应具有输出缓冲区颜色格式的新MediaFormat对象。在我的情况下,它不是256(JPEG数据)。它来自MediaCodecInfo.CodecCapabilities类 - http://developer.android.com/reference/android/media/MediaCodecInfo.CodecCapabilities.html#COLOR_TI_FormatYUV420PackedSemiPlanar –
是的。如果你看看我链接的页面上的EncodeDecodeTest.java,它将获得第619行的格式,并将它传递给checkFrame()。在第966行,颜色格式与已知格式进行比较以决定如何进行。 – fadden