2016-09-02 11 views
11

Я пытался понять это на некоторое время, но по какой-то причине, когда я начинаю записывать видео с камерой, предварительный просмотр масштабируется. У меня есть следующий код из некоторые примеры:Камера для 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 в награду)

+0

Вы пытались проверить, сколько раз вызывается 'surfaceChanged'? Возможно, это связано с тем, что вы вызываете 'getBestPreviewSize' метод обратного вызова, который вызывается каждый раз, когда изменяется поверхность. Так что вы застряли бы в цикле, который вызывает эффект масштабирования. Кажется разумнее называть 'getBestPreviewSize' методом, подобным' onMeasure', который фактически определяет размер вашего представления – Pztar

+0

Итак, рекомендуете ли вы, что я, возможно, создаю настраиваемое представление, которое расширяет 'SurfaceView' с помощью собственного метода' onMeasure'? Возможно, я могу попробовать. –

+0

Да, похоже, имеет смысл. Вы всегда должны проверить, что на самом деле это проблема, добавьте 'Log.i', чтобы узнать, какие значения установлены для' myBestSize.width' и 'myBestSize.height' – Pztar

ответ

0

Я смущен о том, какой масштаб вы говорите, может быть программным увеличением или автофокусом, возможно, поэтому я предлагаю различные потенциальные советы, ведущие к финальной решение:

  1. Реализовать mCamera.setZoomChangeListener, например:

    mCamera.setZoomChangeListener(new Camera.OnZoomChangeListener() { 
        @Override public void onZoomChange(int i, boolean b, Camera camera) { 
         Log.e("StackOverflow","Zoom just changed !"); 
         // Inspect things from here 
        } 
    }); 
    
  2. Отключить плавное масштабирование:

    mCamera.stopSmoothZoom(); // My device doesn't support it, but maybe your device does 
    
  3. Проверьте все Ваши Camera.Parameters:

    Log.e("StackOverflow", "All Camera parameters :"); 
    for(String s : mCamera.getParameters().flatten().split(";")) 
        Log.e("StackOverflow", s + "\n"); 
    
  4. Затем включите все, что может быть масштаба, связанные, например:

    Camera.Parameters parameters = mCamera.getParameters(); 
    parameters.setZoom(100); // My device support some values in the range 100 | 400 
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); 
    parameters.setVideoStabilization(false); 
    
    // Don't forget to add the new parameters to the camera : 
    mCamera.setParameters(parameters); 
    

С уважением

+0

Это не сработало для меня. –

0

Вы, вероятно, setVideoStabilization(true) , В высоком разрешении, например. 4K, если вы включите это, это создаст это увеличение.

 Смежные вопросы

  • Нет связанных вопросов^_^