Los*_*ost 10 android android-camera
我正在自动化android中的一个视频应用程序.为了做到这一点,我需要将视频分辨率设置为最高.
我知道在常规相机中,我可以设置值
/data/data/com.android.gallery3d/shared_prefs/com.android.gallery3d_preferences_0.xml
Run Code Online (Sandbox Code Playgroud)
但我在那里设置的值只是为摄像机而不是为视频设置.知道视频分辨率值存储在哪里吗?
如果有任何ADb命令来存储视频编码分辨率,那么它会更好.
以下是我使用的adb命令,但似乎无法工作:
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
Run Code Online (Sandbox Code Playgroud)
我最近也发现了
/data/data/com.android.gallery3d/shared_prefs/com.android.gallery3d_preferences_0.xml
Run Code Online (Sandbox Code Playgroud)
文件包含最高分辨率的值,键名称为:"pref_video_quality_key"但不知何故,它只设置了相机值并且不执行前置摄像头值
您不必寻找它,而是询问系统。
每个设备都有一种支持的分辨率。您可以根据您的要求选择最佳的可用尺寸:
该怎么办?
步骤1。
您必须检查支持的尺寸。你可以这样做
Camera.Parameters p = myCamera.getParameters();
List<Size> previewsizes = p.getSupportedPreviewSizes();
List<Size> videosizes = p.getSupportedVideoSizes();
Run Code Online (Sandbox Code Playgroud)
然后,您可以选择一个。如果您想自动化此操作,您可以更进一步,并遵循
第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;
}
Run Code Online (Sandbox Code Playgroud)
最后一步,设置参数
步骤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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1967 次 |
| 最近记录: |