Я пытался понять это на некоторое время, но по какой-то причине, когда я начинаю записывать видео с камерой, предварительный просмотр масштабируется. У меня есть следующий код из некоторые примеры:Камера для Android - просмотр изображения при записи видео
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters myParameters = mCamera.getParameters();
List<Camera.Size> sizes = myParameters.getSupportedPreviewSizes();
Camera.Size myBestSize = getBestPreviewSize(sizes, width, height);
if (myBestSize != null) {
myParameters.setPreviewSize(myBestSize.width, myBestSize.height);
myParameters.setVideoStabilization(false);
mCamera.setParameters(myParameters);
mCamera.startPreview();
mCamera.unlock();
}
}
private Camera.Size getBestPreviewSize(List<Camera.Size> sizes, int width, int height) {
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) width/height;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = height;
// Find size
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) {
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;
}
Но предварительный просмотр по-прежнему масштабируется при записи видео. Я попытался вручную настроить размер предварительного просмотра на 1280x720, однако он не работает на всех проверенных мной устройствах, некоторые из них показывают черный SurfaceView.
Есть ли способ предотвратить предварительный просмотр при масштабировании при записи видео? Ни одно из решений здесь, в StackOverflow, похоже, не работает.
EDIT: Я попытался создать пользовательский SurfaceView со своим методом onMesaure, но теперь я получаю ошибку -19 при запуске MediaRecorder. (не обращайте внимания на -16 в награду)
Вы пытались проверить, сколько раз вызывается 'surfaceChanged'? Возможно, это связано с тем, что вы вызываете 'getBestPreviewSize' метод обратного вызова, который вызывается каждый раз, когда изменяется поверхность. Так что вы застряли бы в цикле, который вызывает эффект масштабирования. Кажется разумнее называть 'getBestPreviewSize' методом, подобным' onMeasure', который фактически определяет размер вашего представления – Pztar
Итак, рекомендуете ли вы, что я, возможно, создаю настраиваемое представление, которое расширяет 'SurfaceView' с помощью собственного метода' onMeasure'? Возможно, я могу попробовать. –
Да, похоже, имеет смысл. Вы всегда должны проверить, что на самом деле это проблема, добавьте 'Log.i', чтобы узнать, какие значения установлены для' myBestSize.width' и 'myBestSize.height' – Pztar