gemäß der obigen Frage Anforderung arbeitet wir die Kamera Orientierung fixieren möchten, während der Videoaufnahme. Dies ist eines der herausfordernden Probleme, die ich mit dem gleichen Problem mit meinem Code habe.
Kamera.setDisplayOrientation (90);
Wird die Kamera um 90 Grad drehen und Dies kann dazu führen, dass die Orientierung für einige Geräte nicht geeignet ist.
Also versuche ich das auf diese Weise zu tun, hoffe der folgende Code wird Ihnen helfen.
Das erste, was wir tun wollen Vorschau der Kamera zu starten:
private void startCameraPreview() {
releaseCamera();
if (!previewing) {
previewing = true;
try {
camera = Camera.open(cameraId);
} catch (Exception e) {
camera = null;
}
if (null == camera) {
Toast.makeText(this, "Camera unavailable! Please retry after restarting the phone.", Toast.LENGTH_SHORT).show();
}
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
setOptimalPreviewSize();
else
setLandScapOptimalPreviewSize();
if (camera != null) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
camera.setDisplayOrientation(90);
try {
camera.setPreviewDisplay(previewSv.getHolder());
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
}
callback = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopCameraPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
holder.removeCallback(callback);
if (previewing) {
stopCameraPreview();
}
startCameraPreview();
}
};
previewSv.getHolder().addCallback(callback);
}
hier bei unter Code möchte ich für die optimale Vorschaugröße verwenden ich diese Funktion bin mit:
private void setOptimalPreviewSize() {
if (null != camera && null != previewSv) {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> sizes = null != parameters ? parameters.getSupportedPreviewSizes() : null;
if (null != sizes && previewSv.getWidth() > 0 && previewSv.getHeight() > 0) {
Camera.Size optimalSize = CameraHelper.getOptimalPreviewSize(sizes, dispSize.y, dispSize.x);
ViewGroup.LayoutParams params = previewSv.getLayoutParams();
float aspectRatio = (float) optimalSize.width/(float) optimalSize.height;
params.width = dispSize.x;
params.height = (int) ((float) params.width * aspectRatio);
previewSv.setLayoutParams(params);
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
camera.setParameters(parameters);
System.out.println("setOptimalPreviewSize() optimalSize=" + optimalSize);
}
} else {
System.err.println("setOptimalPreviewSize() failed - camera null");
}
}
und für den Landschafts-Modus verwende ich, dass für die bevorzugen Größe
private void setLandScapOptimalPreviewSize() {
if (null != camera && null != previewSv) {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> sizes = null != parameters ? parameters.getSupportedPreviewSizes() : null;
if (null != sizes && previewSv.getWidth() > 0 && previewSv.getHeight() > 0) {
Camera.Size optimalSize = CameraHelper.getOptimalPreviewSize(sizes, dispSize.y, dispSize.x);
ViewGroup.LayoutParams params = previewSv.getLayoutParams();
float aspectRatio = (float) optimalSize.width/(float) optimalSize.height;
params.height = dispSize.x;
params.width = (int) ((float) params.height * aspectRatio);
previewSv.setLayoutParams(params);
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
camera.setParameters(parameters);
System.out.println("setOptimalPreviewSize() optimalSize=" + optimalSize);
}
} else {
System.err.println("setOptimalPreviewSize() failed - camera null");
}
}
Jetzt nach meinem Projekt requi Ich muss die Videovorschau auf der Hälfte des Bildschirms und das Bild auf der Hälfte des Bildschirms öffnen, damit ich meine gesamte Aktivität mit Ihnen teilen, wo Sie den Code für das Bild löschen können, wenn Sie das nicht benötigen.
schaffen ein actvity ImageVideoActivity.java https://gist.github.com/anonymous/8c776a350098cb3346239dd72b5564b3
jetzt die XML https://gist.github.com/anonymous/bb9fe7c2b3a86e411f0323a06623ead8
hier ist Ihre BaseActvity.java
https://gist.github.com/anonymous/451336f3b0f420f8d01e6b4d6659762f
hier ist Ihre Kamera Hilfsklasse https://gist.github.com/anonymous/1018b5145d013aa5300b577010b1ca6b
hier ist Ihre TextureVideoView.java https://gist.github.com/anonymous/a7f7ba92d1548b867e4fd487083ab67a
Meine Konstanten Datei https://gist.github.com/anonymous/9419c64fbb0410a9a16248956ea096ac
Hoffnung diese Antwort lösen Ihre Problem.Wenn Sie stellen ein Problem mit Code mit comment.we zurückkommen versuchen, gemeinsam zu lösen. Guten Tag !!!
Sie möchten Dimension oder Ausrichtung korrigieren? versuchen, das für die Orientierung zu verwenden, kann dies Ihr Problem beheben mediaRecorder.setVideoSource (MediaRecorder.VideoSource.CAMERA); if (getResources(). GetConfiguration(). Orientation == Konfiguration.ORIENTATION_PORTRAIT) { if (! CameraFront) mediaRecorder.setOrientationHint (90); sonst mediaRecorder.setOrientationHint (270); } –
Ich möchte Orientierung korrigieren Ich verwende mMediaRecorder.setVideoSource (MediaRecorder.VideoSource.SURFACE); –
Wenn Sie camera2 api verwenden, können Sie direkt Kamera anstelle von Surface –