Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用任何颜色格式从MediaCodec输出缩放YUV图像?_Android_Ffmpeg_Yuv_Android Mediacodec - Fatal编程技术网

Android 如何使用任何颜色格式从MediaCodec输出缩放YUV图像?

Android 如何使用任何颜色格式从MediaCodec输出缩放YUV图像?,android,ffmpeg,yuv,android-mediacodec,Android,Ffmpeg,Yuv,Android Mediacodec,我使用MediaCodec对视频进行解码,并使用sws_缩放(来自ffmpeg)对其进行重新缩放。我可以处理一种特殊的颜色格式,例如YUV420P,并将其重新缩放到目标大小。但我必须做一些准备工作,比如将输出缓冲区的线宽和memcpy设置为三个普通片(数据[0]、数据[1]、数据[2])。解码器输出的颜色格式在不同的设备上有所不同。如果我得到了颜色格式,ffmpeg中是否有一种方法可以自动重新缩放它而无需特殊处理(当然,ffmpeg应该支持颜色格式)swscale/libavutil中没有直接获

我使用MediaCodec对视频进行解码,并使用sws_缩放(来自ffmpeg)对其进行重新缩放。我可以处理一种特殊的颜色格式,例如YUV420P,并将其重新缩放到目标大小。但我必须做一些准备工作,比如将输出缓冲区的线宽和memcpy设置为三个普通片(数据[0]、数据[1]、数据[2])。解码器输出的颜色格式在不同的设备上有所不同。如果我得到了颜色格式,ffmpeg中是否有一种方法可以自动重新缩放它而无需特殊处理(当然,ffmpeg应该支持颜色格式)

swscale/libavutil中没有直接获取OMX(MediaCodec)颜色格式的功能,您需要手动映射格式。但是您不需要将输出缓冲区存储到三个单独的缓冲区中,您只需设置三个数据指针data[0]、data[1]和data[2]指向MediaCodec中的输出缓冲区(缓冲区中的同一点,否则您将从该点进行memcpid)


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

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

编辑


我在谷歌上做了更多的搜索,因为它似乎是在进行交互测试,并找到了NDK媒体——好吧,看起来OMX的Broadcom实现有很大的不同,所以大多数东西仍然需要从Scrath构建。你能解释一下为什么需要这样做吗?如果目标只是显示解码后的流,你可以设置预编码查看Java级别的表面,因此我假设解码的目的是其他的。

谢谢,mstorsjo。是的,我知道我需要在ffmpeg中使用pix_fmt映射MediaCodec颜色格式。此外,我必须设置数据指针并处理dest数据指针。如果可以通过pix_fmt自动完成,那将非常棒。因为有太多的格式需要处理。我发现av_image_alloc传回的线条大小可能有一些帮助,但其他方向的大小(与高度的关系)还有来自不同pix_fmt的验证。你有什么建议吗?谢谢,鲁道夫。我之前考虑过使用Stagefright,但我不知道如何开始我的工作。首先它需要在android平台下构建Stagefright代码。其次它需要研究API。我们要做的是为android开发团队工作。你同意吗?所以我给你一些建议p这个想法。你能再解释一下你为什么需要重新缩放吗?你打算对解码后的视频做什么?因为我想用更小的比特率和大小对视频文件进行转码以上传。所以我使用MediaCodec,但它不能直接改变大小。谢谢你的解释。我看过一些基于Java的转码Exmaple(,),但这仅对比特率有帮助。另一个选项是提供预编译的FFmpeg二进制文件(但x264也存在许可证问题),并调用该文件在文件级别进行转码。您的目标是H.264吗?