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ę)
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
Czy sugerujesz, żebym mógł utworzyć niestandardowy widok rozszerzający 'SurfaceView' o własną metodę' onMeasure'? Być może mogę spróbować. –
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