2016-09-02 17 views
11

Próbowałem to rozgryźć przez chwilę, ale z jakiegoś powodu, kiedy zaczynam nagrywać wideo z kamerą, podgląd powiększa się. Mam następujący kod z kilka przykładów:Aparat z Androidem - Podgląd powiększa się podczas nagrywania wideo

@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; 
} 

Ale podgląd wciąż powiększa się podczas nagrywania wideo. Próbowałem ręcznie ustawić rozmiar podglądu na 1280x720, jednak nie działa on na wszystkich testowanych urządzeniach, a niektóre pokazują czarny SurfaceView.

Czy istnieje sposób zapobiegania powiększaniu podglądu podczas nagrywania wideo? Żadne z rozwiązań tutaj w StackOverflow nie działa.

EDYCJA: Próbowałem utworzyć niestandardowy SurfaceView z własną metodą onMesaure, ale teraz pojawia się błąd -19 po uruchomieniu MediaRecorder. (pomijając -16 w nagrodę)

+0

Czy próbowałeś sprawdzić, ile razy nazywa się "surfaceChanged"? Może to wynikać z faktu, że wywołujesz 'getBestPreviewSize' w metodzie wywołania zwrotnego, która jest wywoływana za każdym razem, gdy zmienia się powierzchnia ... w ten sposób utknąłbyś w pętli, która powoduje efekt powiększenia. Wydaje się rozsądniejsze wywoływanie 'getBestPreviewSize' w metodzie takiej jak' onMeasure', która faktycznie określa rozmiar twojego widoku. – Pztar

+0

Czy sugerujesz, żebym mógł utworzyć niestandardowy widok rozszerzający 'SurfaceView' o własną metodę' onMeasure'? Być może mogę spróbować. –

+0

Tak, wydaje się, że ma to więcej sensu. Powinieneś zawsze sprawdzić, czy to faktycznie jest problem, dodać 'Log.i', aby zobaczyć, jakie wartości są ustawione dla' myBestSize.width' i 'myBestSize.height' – Pztar

Odpowiedz

0

Jestem zdezorientowany z powodu rodzaju zoomu, o którym mówisz, może być zoomem programowym lub autofokusem, więc proponuję różne potencjalne wskazówki prowadzące do finału rozwiązanie:

  1. Wdrożenie mCamera.setZoomChangeListener, np:

    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. Wyłącz sprawnego zoom:

    mCamera.stopSmoothZoom(); // My device doesn't support it, but maybe your device does 
    
  3. Sprawdzić wszystkie Twoi Camera.Parameters:

    Log.e("StackOverflow", "All Camera parameters :"); 
    for(String s : mCamera.getParameters().flatten().split(";")) 
        Log.e("StackOverflow", s + "\n"); 
    
  4. Następnie przełączyć niczego, co mogłoby być Powiększenie towarzyszący, np

    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); 
    

Pozdrowienia

+0

To nie działa dla mnie. –

0

Prawdopodobnie masz setVideoStabilization(true) . W wysokiej res, np. 4K, jeśli włączysz tę funkcję, stworzy to powiększenie skoku.

Powiązane problemy