2014-10-17 192 views
0

我正在使用MediaCodec来解码视频,并使用sws_scale(来自ffmpeg)重新调整它。我可以处理一种特殊的颜色格式,例如。 YUV420P,并将其重新缩放至目标尺寸。但是我必须做一些准备工作,比如将lineize和memcpy的输出缓冲区设置为三个普通切片(data [0],data [1],data [2]),并且解码器输出的颜色格式在不同的设备上有所不同。如果我得到colorformat,ffmpeg中是否有方法自动重新调整它的大小而不进行特殊处理(当然,颜色格式应该由ffmpeg支持)?如何从任何颜色格式的MediaCodec输出中缩放YUV图像?

回答

1

swscale/libavutil没有直接采用OMX(MediaCodec)颜色格式的功​​能,您需要手动映射格式。但是,您不需要将输出缓冲区memcpy分成三个单独的缓冲区,只需将三个数据指针data [0],data [1]和data [2]设置为从MediaCodec指向输出缓冲区(同一点在缓冲区中,否则您将会使用memcpied)。

正常的颜色格式(如YUV420P和NV12)应该可以正常工作,您只需要设置格式常量之间的映射。但是一些MediaCodec解码器(特别是Qualcomm解码器)通常使用专有的平铺格式,这需要更多的努力来解读,而swscale不直接支持该解码器,您需要自己解读。

+0

谢谢,mstorsjo.Yes,我知道我需要在ffmpeg中用pix_fmt映射MediaCodec颜色格式。除此之外,我必须设置数据指针并处理dest数据指针。如果这可以通过传递pix_fmt,这将非常美妙。因为有太多的格式需要处理。我发现av_image_alloc传回的行可能有一些帮助,但其他版本的大小(与hight的关系)也来自不同的pix_fmt。你有什么建议吗? – 2014-10-17 07:32:14

0

这只是一个基于我在Raspberry Pi上的OMX经验的直观建议,但是,您可以检查Stagefright库是否提供任何类似于NDK的C/C++接口的OMX--在这种情况下,如果没有只有一个解码器组件和一个调整大小组件(例如Raspberry Pi有component),那么你可以制作一个OMX管道,然后组件可以自动协商这些格式,但这只是一个假设,我从来没有深入研究过Stagefright自己,我知道它的意图是从Java级别通过MediaCodec和其他类,但仍然可以看看。如果Stagefright具有这样的API,我可以提供一些OMX包装代码,以简化我为Raspberry Pi制作的组件的使用,因为从头开始构建OMX代码是相当多的工作。

编辑

我没多一些谷歌搜索这个,因为它似乎interresting,发现了一个NDK媒体sample - 以及它似乎是Broadcom公司执行OMX的不同之处很多,所以还是大多数的东西会被需要从scracth构建。你能解释一下为什么你需要这样做吗?如果目标只是显示解码流,则可以在Java级别设置预览表面,所以我认为解码的内容是其他的。

+0

感谢Rudolfs.I在考虑使用Stagefright之前,但我只是不知道如何开始我的工作。首先它需要在android平台下构建Stagefright代码。其次,它需要研究API。并且我们想要做什么是Android开发团队的工作。你同意吗?所以我放弃了这个想法。 – 2014-10-17 07:49:26

+0

你能解释一下为什么你需要重新缩放?你打算如何处理解码的视频? – 2014-10-17 07:52:41

+0

因为我想将较小的比特率和大小的视频文件转码为上传。所以我使用MediaCodec,但它不能直接更改大小。 – 2014-10-17 11:15:30

相关问题