【问题标题】:Record video with a size of 480 * 480 px in android?在android中录制大小为480 * 480 px的视频?
【发布时间】:2014-02-28 07:45:39
【问题描述】:

我已经构建了一个类似于 vine app 视频录制的模块。但我无法将视频尺寸设为 480x480 px 。有没有办法做到这一点。谢谢

【问题讨论】:

  • 你用什么录音?告诉我们你到目前为止做了什么
  • 请贴一些代码
  • asked Feb 4 '14 - 所以你似乎花了将近 4 年的时间才找到答案 :)
  • 对不起,朋友们,我没有任何关于此的代码。我为我的一个从未发生过的项目提出了这个问题,因为当时我无法找到最佳解决方案。

标签: android video-capture vine


【解决方案1】:

Android 相机的可用尺寸列表有限。所以我们需要选择最佳的相机尺寸并从原始相机图像中选择子图像(480x480)。 例如,在我的 HTC one m8 上,我有这个尺寸的相机:

  1. 1920x1088
  2. 1920x1080
  3. 1808x1080
  4. ....
  5. 720x480
  6. 640x360
  7. 640x480
  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);
}

【讨论】:

    【解决方案2】:

    android 的视频捕获分辨率仅限于相机支持的原生分辨率。

    您可以尝试使用第三方库进行视频后期处理。因此,您可以裁剪或重新缩放相机拍摄的视频。

    我在用这个

    android-gpuimage-videorecording

    而且效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2014-03-30
      相关资源
      最近更新 更多