【发布时间】:2014-08-01 12:04:58
【问题描述】:
我必须解决 android 硬件摄像头的问题。我希望我的设备始终录制横向视频,即使它的方向是垂直的。我画了一些图片来支持我的问题:
这是我得到的: http://joxi.ru/9IHbU_3JTJDrRyVH-XA
这就是我想要的: http://joxi.ru/IYLbU4wyTJC1LhQcd4Q
我不能说它甚至可能(我认为不可能,因为硬件矩阵不能旋转)。但我的客户认为是。请判断我们。
更新:这是我的代码。
//..import...
public class MainActivity extends Activity {
SurfaceView surfaceView;
Camera camera;
MediaRecorder mediaRecorder;
//...public and private variables...
@Override
protected void onCreate(Bundle savedInstanceState) {
//......
SurfaceHolder holder = surfaceView.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
setCameraDisplayOrientation(CAM_ID);
camera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
}
@Override
protected void onResume() {
super.onResume();
camera = Camera.open(this.CAM_ID);
}
@Override
protected void onPause() {
super.onPause();
releaseMediaRecorder();
if (camera != null)
camera.release();
camera = null;
}
public void setListeners() {/*....*/}
public void onClickStartRecord(View view) {
if (prepareVideoRecorder()) {
mediaRecorder.start();
} else releaseMediaRecorder();
}
public void onClickStopRecord(View view) {
if (mediaRecorder != null) {
mediaRecorder.stop();
releaseMediaRecorder();
}
}
private boolean prepareVideoRecorder() {
camera.unlock();
mediaRecorder = new MediaRecorder();
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
CamcorderProfile profile = CamcorderProfile.get(this.CAM_ID, CamcorderProfile.QUALITY_LOW);
mediaRecorder.setProfile(profile);
if(this.orientation == 270 || this.orientation == 90 )
mediaRecorder.setOrientationHint(90);
mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
try {
mediaRecorder.prepare();
} catch (Exception e) {
e.printStackTrace();
releaseMediaRecorder();
return false;
}
return true;
}
private void releaseMediaRecorder() {
if (mediaRecorder != null) {
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder = null;
camera.lock();
}
}
private void setCameraDisplayOrientation(int cameraId) {
// определяем насколько повернут экран от нормального положения
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result = 0;
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(cameraId, info);
if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
result = ((360 - degrees) + info.orientation);
} else
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
result = ((360 - degrees) - info.orientation);
result += 360;
}
result = result % 360;
camera.setDisplayOrientation(result);
this.orientation = result;
}
}
【问题讨论】:
-
您是否通过意图启动了 cam?
-
SilentKiller,恐怕我没有太多尝试。我可以使用 mediaRecorder.setOrientationHint 和 camera.setDisplayOrientation 方法设置视频录制方向。但这些都不能解决我的问题。我真的认为当我的设计是垂直方向时,硬件不允许录制横向视频。但我不得不问:)
-
Rob,我认为不是。所有这些主题都围绕视频和照片方向,但矩阵方向总是类似于设备(以我的拙见)。换句话说,我可以设置纵向或横向模式,但是当我的设备垂直时我无法录制宽视频,我只能录制窄视频。
-
我不确定这不可能。你能发布一些代码吗?
标签: android android-camera orientation