【问题标题】:Where is Video resolution stored in android?视频分辨率存储在android中的哪里?
【发布时间】:2013-12-06 00:18:30
【问题描述】:

我正在自动化 android 中的一个视频应用程序。为此,我需要将视频分辨率设置为最高。

我知道在普通相机中,我可以设置值

 /data/data/com.android.gallery3d/shared_prefs/com.android.gallery3d_preferences_0.xml 

但我在那里设置的值只是为相机设置的,而不是为视频设置的。知道视频分辨率值存储在哪里吗?

如果有ADb命令存储视频编码分辨率就更好了。

以下是我使用的 adb 命令,但 nto 似乎有效:

 adb shell am start -a android.media.action.VIDEO_CAPTURE  --ei android.intent.extras.CAMERA_FACING 1 --ei android.intent.extras.EXTRA_VIDEO_QUALITY 1  -n com.android.gallery3d/com.android.camera.CameraActivity

我最近也发现

 /data/data/com.android.gallery3d/shared_prefs/com.android.gallery3d_preferences_0.xml

文件包含最高分辨率的值,键名是: "pref_video_quality_key" 但不知何故,它只设置后置摄像头值,不做前置摄像头值

【问题讨论】:

  • 好吧,我通过以下命令尝试它:adb shell am start -a android.media.action.VIDEO_CAPTURE --ei android.intent.extras.EXTRA_VIDEO_QUALITY 1 -n com.android.gallery3d/com .android.camera.CameraActivity 但这似乎没有设置质量
  • 您的 Intent Extras 的名称是错误的。例如,它应该是“android.intent.extra.videoQuality” 全大写形式是 Java API 中的一个常量,您需要更正每一个,然后使用 am 命令查找它定义为精确的字符串文字。
  • @ChrisStratton:相机朝向参数工作得非常好。唯一不起作用的是视频质量:我试过adb shell am start -a android.media.action.VIDEO_CAPTURE --ei androind.intent.extra.videoQuality 1 -n com.android.gallery3d/com.android.camera.CameraActivity,但效果不佳
  • @ChrisStratton:您的解决方案奏效了。您可以为此单独回答,以便我可以给您赏金。

标签: android android-camera


【解决方案1】:

您不必寻找,但询问系统。

每个设备都有一种受支持的分辨率。您可以根据自己的要求选择最佳可用尺寸:

怎么办?

第 1 步。

您必须检查支持的尺寸。你可以这样做

Camera.Parameters p = myCamera.getParameters(); 
List<Size> previewsizes = p.getSupportedPreviewSizes();
List<Size> videosizes = p.getSupportedVideoSizes();

然后,您可以选择一个。如果你想自动化这个,你可以走得更远,并按照

第 2 步

编写一个函数来选择最佳可用尺寸,它将接收支持的尺寸和所需的尺寸。你可以获得比例更接近所需的尺寸,如果没有足够好的尺寸,你会得到高度接近所需的尺寸,或者你可以得到最大的东西,例如:

public static final int BEST_RATIO=0;
public static final int IMPORTANT_HEIGHT=2;
public static final int IMPORTANT_WIDTH=1;
public static final int BIGGEST=3;

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h, int mode) {
    final double ASPECT_TOLERANCE = 0.2;
    double targetRatio = (double) w / h;
    if (sizes == null)
        return null;

    Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

   if (mode==BEST_RATIO)
   {  for (Size size : sizes) {
        Log.d("Camera", "Checking size " + size.width + "w " + size.height
                + "h");
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
            continue;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }
   }


   if (mode= IMPORTANT_HEIGHT) { //you can do other for width
        minDiff = Double.MAX_VALUE;
        for (Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
     if (mode=IMPORTANT_WIDTH) { //you can do other for width
        minDiff = Double.MAX_VALUE;
        for (Size size : sizes) {
            if (Math.abs(size.Width - targetWidth) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.Width - targetWidth);
            }
        }
    }   

  else  { 
       minDiff = 0;
       for (Size size : sizes) {
           if (  size.height * size.width > minDiff ) {
               optimalSize = size;
               minDiff = size.height * size.width ;
           }
       }
   }
  return optimalSize;
}

最后一步,设置参数

第 3 步

private int desiredwidth=640, desiredheight=360; 

Size optimalPreviewSize = getOptimalPreviewSize(previewsizes, desiredwidth, desiredheight,BIGGEST);         

Size optimalVideoSize = getOptimalPreviewSize(videosizes, desiredwidth, desiredheight,BIGGEST);      

p.setPreviewSize(optimalPreviewSSize.width, optimalPreviewSSize.height);
CamcorderProfile profile = CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_LOW);
 profile.videoFrameHeight= optimalVideoSize.height;
 profile.videoFrameWidth=optimalVideoSize.with;
 mCamera.unlock();
 mMediaRecorder.setCamera(mCamera);
 mMediaRecorder = new MediaRecorder();
 mMediaRecorder.setVideoSize(optimalVideoSize.width, optimalVideoSize.height);
 myCamera.setParameters(p);

【讨论】:

  • 非常感谢您的详细解释。但是,我并没有为它做一个应用程序。我需要一个 ADb 命令。
猜你喜欢
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 2015-11-02
相关资源
最近更新 更多