Я использую API камеры 2 для сохранения изображений JPEG на диске. В настоящее время у меня на Nexus 5X есть 3-4 кадра в секунду, я бы хотел улучшить его до 20-30. Является ли это возможным?Камера 2, увеличение FPS
Изменение формата изображения на YUV Мне удалось создать 30 кадров в секунду. Можно ли сохранить их при этой частоте кадров, или я должен сдаться и жить со своими 3-4 кадрами в секунду?
Очевидно, что я могу использовать код, если это необходимо, но если все согласны с тем, что это невозможно, я просто сдаюсь. Использование NDK (например, с libjpeg) является вариантом (но, очевидно, я бы предпочел избежать его ...).
Благодаря
EDIT: вот как я преобразовать YUV android.media.Image в один байт []:
private byte[] toByteArray(Image image, File destination) {
ByteBuffer buffer0 = image.getPlanes()[0].getBuffer();
ByteBuffer buffer2 = image.getPlanes()[2].getBuffer();
int buffer0_size = buffer0.remaining();
int buffer2_size = buffer2.remaining();
byte[] bytes = new byte[buffer0_size + buffer2_size];
buffer0.get(bytes, 0, buffer0_size);
buffer2.get(bytes, buffer0_size, buffer2_size);
return bytes;
}
EDIT 2: еще один метод, который я нашел, чтобы преобразовать изображение в YUV байт []:
private byte[] toByteArray(Image image, File destination) {
Image.Plane yPlane = image.getPlanes()[0];
Image.Plane uPlane = image.getPlanes()[1];
Image.Plane vPlane = image.getPlanes()[2];
int ySize = yPlane.getBuffer().remaining();
// be aware that this size does not include the padding at the end, if there is any
// (e.g. if pixel stride is 2 the size is ySize/2 - 1)
int uSize = uPlane.getBuffer().remaining();
int vSize = vPlane.getBuffer().remaining();
byte[] data = new byte[ySize + (ySize/2)];
yPlane.getBuffer().get(data, 0, ySize);
ByteBuffer ub = uPlane.getBuffer();
ByteBuffer vb = vPlane.getBuffer();
int uvPixelStride = uPlane.getPixelStride(); //stride guaranteed to be the same for u and v planes
if (uvPixelStride == 1) {
uPlane.getBuffer().get(data, ySize, uSize);
vPlane.getBuffer().get(data, ySize + uSize, vSize);
}
else {
// if pixel stride is 2 there is padding between each pixel
// converting it to NV21 by filling the gaps of the v plane with the u values
vb.get(data, ySize, vSize);
for (int i = 0; i < uSize; i += 2) {
data[ySize + i + 1] = ub.get(i);
}
}
return data;
}
Вы использовали метод отслеживания или другие методы, чтобы точно определить, где ваше время тратится? Какое разрешение вы используете? Вы делаете свой диск ввода-вывода в отдельном потоке? – CommonsWare
Да, время потрачено на преобразование YUV -> JPEG и на диск ввода/вывода. Я использую максимальное разрешение (4000 * 3000 или около того). И да, дисковый ввод-вывод имеет резьбу. Но если я многопоточно сохраняю изображение, и если это занимает больше времени, чем создание изображения, вероятно, вероятность заразится OOME (или без дискового пространства), верно? –
«Время, потраченное на преобразование YUV -> JPEG» - что такое преобразование YUV-> JPEG? Почему Camera2 не дает вам JPEG напрямую, используя любое аппаратное устройство, предназначенное для этого преобразования? – CommonsWare