Próbuję utworzyć niestandardową aplikację wideo. Iwork za pomocą ustawień tylko w manifeście 2.2 (API 8).Przechwytywanie wideo MediaRecorder w trybie portretowym
Wszystko idzie dobrze, ale nie rozumiem, dlaczego wideo w trybie pionowym nie różni się od obrazu z lanscape.
Aby wykrywanie urządzenia zmienił orientację Używam tego kodu w ramach surfaceChanged()
if (mCamera != null) {
Camera.Parameters p = mCamera.getParameters();
try {
mCamera.stopPreview();
} catch (Exception e) {
// TODO: handle exception
}
int previewWidth = 0;
int previewHeight = 0;
if (mPreviewSize != null) {
Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
switch (rotation) {
case Surface.ROTATION_0:
previewWidth = mPreviewSize.height;
previewHeight = mPreviewSize.width;
mCamera.setDisplayOrientation(90);
break;
case Surface.ROTATION_90:
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
mCamera.setDisplayOrientation(0);
break;
case Surface.ROTATION_180:
previewWidth = mPreviewSize.height;
previewHeight = mPreviewSize.width;
mCamera.setDisplayOrientation(270);
break;
case Surface.ROTATION_270:
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
mCamera.setDisplayOrientation(180);
break;
}
p.setPreviewSize(previewWidth, previewHeight);
mCamera.setParameters(p);
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Log.d(TAG, "Cannot start preview.", e);
}
}
działa jak czar. Jeśli obrócę orientację zmiany powierzchni urządzenia, wywołam surfaceChanged, gdzie kamera jest ustawiona na odpowiednią DisplayRotation.
Pytanie, jak określić później, czy wideo zostało zrobione w trybie lanscape, czy w trybie portretu. Jak już dostałem wszystkie filmy są przechwytywane w orientacji poziomej. Nie zależy to od metody setDisplayOrientation, która wpływa tylko na proces podglądu.
Eksplorowanie problemu Zauważyłem, że jeśli użyć standardowej aplikacji Camera, zapisuje specjalny znacznik do pliku wideo (widoczny w MediaInfo): Obrót: 90 dla przechwyconych portretów wideo.
Ale klasa MediaRecorder nie.
Wydaje się, że to jest problem. Ktoś musi to rozwiązać?
setOrientationHint jest dostępna tylko dla API 9. Mam ten sam problem, ale potrzebne jest rozwiązanie dla API 8. – AndroidDev
Spędziłem wiele godzin próbując rozgryźć ten głupi problem z orientacją na podglądzie. Wielkie dzięki @Taiko! Oto, co działało dla mnie: w metodzie 'onCreate' klasy implementującej' SurfaceHolder.Callback' zawarłem ten kod: 'mCamera = Camera.open(); mCamera.setDisplayOrientation (90); mCamera.unlock(); 'a następnie' mediaRecorder = new MediaRecorder(); mediaRecorder.setCamera (mCamera); '. Pracował jak urok! – Cat