Я построил модуль, похожий на видеозапись приложения для видеомонтажа. Но я не могу сделать размер видео до 480x480 px. Есть ли способ сделать это. Благодаря
Запись видео с размером 480 * 480 пикселей в android?
Ответ 1
Камера Android имеет ограниченный список доступных размеров для камеры. Поэтому нам нужно выбрать лучший размер камеры и выбрать суб изображение (480x480) с исходного изображения камеры. Например, на моем HTC один м8 у меня такие размеры для камеры:
- 1920x1088
- 1920x1080
- 1808x1080
- ....
- 720x480
- 640x360
- 640х480
- 576x432
- 480x320
- 384x288
- 352x288
- 320x240
- 240x160
- 176x144
Вы можете получить список доступных размеров с помощью getSupportedPreviewSizes().
public Camera mCamera;//Your camera instance
public List<Camera.Size> cameraSizes;
private final int CAMERA_IMAGE_WIDTH = 480;
private final int CAMERA_IMAGE_HEIGHT = 480;
...
cameraSizes = mCamera.getParameters().getSupportedPreviewSizes()
После этого вам нужно найти наиболее подходящий размер камеры и задать размер предварительного просмотра для камеры.
Camera.Size findBestCameraSize(int width, int height){
Camera.Size bestSize = cameraSizes.get(0);
int minimalArea = bestSize.height * bestSize.width;
for(int i = 1;i < cameraSizes.size();i++){
Camera.Size size = cameraSizes.get(i);
int area = size.height * size.width;
if(size.width < width || size.height < height){
continue;
}
if(area < minimalArea){
bestSize = size;
minimalArea = area;
}
}
return bestSize;
}
...
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
//Do something
}
public void surfaceChanged(SurfaceHolder holder,
int format, int width,
int height) {
Camera.Parameters params = mCamera.getParameters();
Camera.Size size = findBestCameraSize(CAMERA_IMAGE_WIDTH, CAMERA_IMAGE_HEIGHT);
params.setPreviewSize(size.width, size.height);
camera.setParameters(params);
if(mCamera != null){
mCamera.startPreview();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Do something
}
};
После настройки размера камеры нам нужно получить вспомогательное изображение из растрового изображения результата с камеры. Вам нужно поместить этот код, где вы получите растровое изображение (обычно я использую библиотеку OpenCV и матрицы для лучшей производительности).
Bitmap imageFromCamera = //here ve receive image from camera.
Camera.Size size = mCamera.getParameters().getPreviewSize();
int x = (size.width - CAMERA_IMAGE_WIDTH)/2;
int y = (size.height - CAMERA_IMAGE_HEIGHT)/2;
Bitmap resultBitmap = null;
if(x < 0 || y < 0){
resultBitmap = imageFromCamera;
}else{
resultBitmap = Bitmap.createBitmap(imageFromCamera, x, y, CAMERA_IMAGE_WIDTH, CAMERA_IMAGE_HEIGHT);
}
Ответ 2
Разрешение видеозахвата для андроида ограничено собственными разрешениями, поддерживаемыми камерой.
Вы можете попробовать использовать стороннюю библиотеку для обработки видеопотоков. Таким образом, вы можете обрезать или повторно масштабировать видео, снятое камерой.
Я использую этот
android-gpuimage-videorecording
и он работает достаточно хорошо.