Записать видео размером 480 * 480 px в android?

Я построил модуль, похожий на запись видео в приложении Vine. Но я не могу сделать видео размером до 480х480 пикселей. Есть ли способ сделать это. Спасибо

2 ответа

Камера Android имеет ограниченный список доступных размеров для камеры. Поэтому нам нужно выбрать лучший размер камеры и выбрать вспомогательное изображение (480x480) из исходного изображения камеры. Например на моем HTC One M8 у меня есть эти размеры для камеры:

  1. 1920x1088
  2. 1920x1080
  3. 1808x1080
  4. ....
  5. 720x480
  6. 640x360
  7. 640х480
  8. 576x432
  9. 480x320
  10. 384x288
  11. 352x288
  12. 320x240
  13. 240x160
  14. 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);
}

Разрешение захвата видео для Android ограничено исходным разрешением, поддерживаемым камерой.

Вы можете попробовать использовать стороннюю библиотеку для постобработки видео. Таким образом, вы можете обрезать или масштабировать видео, снятое камерой.

Я использую этот

Android-gpuimage-видеозаписи

и это работает довольно хорошо.

Другие вопросы по тегам