Как установить VideoSize, когда getSupportedVideoSizes возвращает ноль
Когда я использую MediaRecorder для записи видео, я хочу установить размер видео. Но камера getParameters() возвращает getSupportedVideoSizes, равный null, и getSupportedPreviewSizes - это нормально, он возвращает 1920x1088,1280x960,1280x720,960x540,720x540,720x480,640x480. 352x288,320x240,176x144. Как бы то ни было, если я установлю значение videoSize MediaRecorder, экран привязанного SurfaceView будет заморожен через несколько секунд, когда я начну запись. Итак, что мне делать?
2 ответа
Мой обходной путь был таким:
public void setVideoSize(int width, int height) {
// Just set Preview size...
Camera.Parameters params = getParameters();
List<Camera.Size> sizes = params.getSupportedPreviewSizes();
Camera.Size preferred = params.getPreferredPreviewSizeForVideo();
if (preferred == null) {
preferred = sizes.get(0);
}
Camera.Size optimalPreview = Util.getOptimalPreviewSize(mContext, sizes,
width, height);
setPreviewSize(optimalPreview.width, optimalPreview.height);
}
Где Util.getOptimalPreviewSize был:
/**
* Returns the optimal preview size for photo shots
*
* @param currentActivity
* @param sizes
* @param widthImage
* @param heightImage
* @return
*/
public static Size getOptimalPreviewSize(Activity currentActivity,
List<Size> sizes, int widthImage, int heightImage) {
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = 0;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
// Recupero le dimensioni dello schermo per confrontare le dimensioni della
// preview con quelle dello schermo, in modo tale che a video veda esattamente ciò che poi
// andrò a fotografare
int widthScreen = currentActivity.getWindow().getDecorView().getWidth();
int heightScreen = currentActivity.getWindow().getDecorView().getHeight();
targetRatio = (double) widthImage / heightImage;
if (Util.getDisplayRotation(currentActivity) == 0 || Util.getDisplayRotation(currentActivity) == 180) {
int temp = heightScreen;
heightScreen = widthScreen;
widthScreen = temp;
}
int targetHeight = heightScreen;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
if (size.width <= widthScreen && size.height <= heightScreen) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
В зависимости от поворота камеры (НЕ ЭКРАНА!!) и размера изображения / видео для захвата будет найден лучший размер предварительного просмотра видео / изображения.
Наконец я решаю проблему, просмотр текстуры в верхней части моей деятельности, есть и другие. Я устанавливаю ширину и высоту textureview в java-коде, но если я установлю это в XML с помощью dp, все будет в порядке, так что, какова взаимосвязь между предварительным просмотром textureview (ширина и высота) и записанным видео (ширина и высота)?