相关疑难解决方法(0)

如何正确使用YUV_420_888和MediaCodec的ImageReader将视频编码为h264格式?

我正在Android设备上实现相机应用程序。当前,我使用Camera2 API和ImageReader来获取YUV_420_888格式的图像数据,但是我不知道如何将这些数据准确地写入MediaCodec。

这是我的问题:

  1. 什么YUV_420_888

该格式YUV_420_888是不明确的,因为它可以属于任何形式YUV420的家庭,如YUV420PYUV420PPYUV420SPYUV420PSP,对不对?

通过访问图像的三个平面(#0,#1,#2),我可以获得该图像的Y(#0),U(#1),V(#2)值。但是这些值的排列在不同设备上可能不相同。例如,如果YUV_420_888确实表示YUV420P,则Plane#1和Plane#2的大小均为Plane#0的四分之一。如果YUV_420_888确实表示YUV420SP,则Plane#1和Plane#2的大小都是Plane#0大小的一半(Plane#1和Plane#2的每个包含U,V值)。

如果要将这些数据从图像的三个平面写入MediaCodec,我需要转换为哪种格式?YUV420,NV21,NV12 ...

  1. 什么COLOR_FormatYUV420Flexible

该格式COLOR_FormatYUV420Flexible也有歧义,因为它可以是属于该YUV420家族的任何格式,对吗?如果将KEY_COLOR_FORMATMediaCodec对象的选项设置为COLOR_FormatYUV420Flexible,我应该输入哪种格式的数据(YUV420P,YUV420SP ...?)?

  1. 怎么样使用COLOR_FormatSurface

我知道MediaCodec具有自己的表面,如果我将KEY_COLOR_FORMATMediaCodec对象的选项设置为,则可以使用该表面COLOR_FormatSurface。使用Camera2 API,我不需要自己将任何数据写入MediaCodec对象。我可以耗尽输出缓冲区。

但是,我需要从相机更改图像。例如,绘制其他图片,在上面写一些文字,或将另一个视频插入为POP(图片的图片)。

我可以使用ImageReader从Camera读取图像,然后重新绘制图像,然后将新数据写入MediaCodec的表面,然后将其排干吗?怎么做?

编辑1

我通过使用COLOR_FormatSurface和RenderScript 实现了该功能。这是我的代码:

onImageAvailable 方法:

public void onImageAvailable(ImageReader imageReader) {
    try {
        try (Image image = imageReader.acquireLatestImage()) {
            if (image == null) …
Run Code Online (Sandbox Code Playgroud)

camera yuv android-camera android-camera2

5
推荐指数
1
解决办法
2486
查看次数

标签 统计

android-camera ×1

android-camera2 ×1

camera ×1

yuv ×1