相关疑难解决方法(0)

将位图数组转换为YUV(YCbCr NV21)

如何将返回的Bitmap转换BitmapFactory.decodeFile()为YUV格式(simillar到相机的onPreviewFrame()返回字节数组)?

android image-processing yuv android-image android-camera

27
推荐指数
2
解决办法
4万
查看次数

Android ImageReader获得NV21格式?

我没有成像或图形的背景,所以请耐心等我:)

我在我的一个项目中使用JavaCV.在这些例子中,Frame构造了一个具有一定大小的缓冲区的a .

public void onPreviewFrame(byte[] data, Camera camera)在Android中使用该函数时,data如果将声明声明Framenew Frame(frameWidth, frameHeight, Frame.DEPTH_UBYTE, 2);where frameWidthframeHeight声明为,则复制此字节数组没有问题

Camera.Size previewSize = cameraParam.getPreviewSize();
int frameWidth = previewSize.width;
int frameHeight = previewSize.height;
Run Code Online (Sandbox Code Playgroud)

最近,Android添加了一种捕获屏幕的方法.当然,我想抓住那些图像并将它们转换为Frames.我修改了Google的示例代码以使用ImageReader.

ImageReader被构造为ImageReader.newInstance(DISPLAY_WIDTH, DISPLAY_HEIGHT, PixelFormat.RGBA_8888, 2);.所以目前它使用RGBA_8888像素格式.我使用以下代码将字节复制到Frame,实例化为new Frame(DISPLAY_WIDTH, DISPLAY_HEIGHT, Frame.DEPTH_UBYTE, 2);:

ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
mImage.close();
((ByteBuffer) frame.image[0].position(0)).put(bytes); …
Run Code Online (Sandbox Code Playgroud)

android imaging image android-mediaprojection

8
推荐指数
1
解决办法
7966
查看次数

有没有办法在Android上进行图像压缩和保存更快?

情况

我应该在我的应用程序中显示200-350帧动画.图像的分辨率为500x300.如果用户想要共享动画,我必须将其转换为视频.对于转换我使用ffmpeg命令.

ffmpeg -y -r 1 -i /sdcard/videokit/pic00%d.jpg -i /sdcard/videokit/in.mp3 -strict experimental -ar 44100 -ac 2 -ab 256k -b 2097152 -ar 22050 -vcodec mpeg4 -b 2097152 -s 320x240 /sdcard/videokit/out.mp4
Run Code Online (Sandbox Code Playgroud)

要将图像转换为视频,ffmpeg需要实际文件而不是Bitmap或byte [].

问题

将位图压缩到图像文件需要花费很多时间.210图像转换大约需要1分钟才能完成平均设备(HTC ONE m7).在同一设备上将图像文件转换为mp4大约需要15秒.所有用户必须等待大约1.5分钟.

我试过的

  1. 我改变comrpession格式形式PNG到JPEG(1.5分钟结果与JPEG压缩(质量= 80来实现),用PNG大约需要2-2.5分钟)成功
  2. 试图找到如何将字节[]或位图传递给ffmpeg - 没有成功.

  1. 有没有办法(库(甚至本机))使保存过程更快.
  2. 有没有办法将byte []或Bitmap对象(我的意思是png文件解压缩到Android Bitmap Class Object)传递给ffmpeg库视频创建方法
  3. 是否有任何其他工作库将在大约30秒(200帧)中从byte []或Bitmap对象创建mp4(或任何支持的格式(由主社交网络支持)).

java compression android ffmpeg save

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

camera2 捕获的图片 - 从 YUV_420_888 到 NV21 的转换

通过 camera2 API,我们接收到格式为YUV_420_888的 Image 对象。然后我们使用以下函数转换为NV21

private static byte[] YUV_420_888toNV21(Image image) {
    byte[] nv21;
    ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
    ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
    ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();

    int ySize = yBuffer.remaining();
    int uSize = uBuffer.remaining();
    int vSize = vBuffer.remaining();

    nv21 = new byte[ySize + uSize + vSize];

    //U and V are swapped
    yBuffer.get(nv21, 0, ySize);
    vBuffer.get(nv21, ySize, vSize);
    uBuffer.get(nv21, ySize + vSize, uSize);

    return nv21;
}
Run Code Online (Sandbox Code Playgroud)

虽然此函数与 配合良好cameraCaptureSessions.setRepeatingRequest,但在调用 时,我们会在进一步处理(在 JNI 端)中遇到分段错误cameraCaptureSessions.capture。两者都通过 ImageReader 请求 YUV_420_888 …

android yuv android-camera2

2
推荐指数
1
解决办法
7162
查看次数