如何在Android上播放时解决旋转90度的视频?

时间:2014-01-13 16:01:37

标签: android video surfaceview

我的Android应用程序上有一个录像机,效果很好。最重要的一段代码在这里:

protected void startRecording() throws IOException 
{

 mCamera.stopPreview();
 mCamera.unlock();
 mrec = new MediaRecorder();  
 mrec.setCamera(mCamera);   
 mrec.setAudioSource(MediaRecorder.AudioSource.MIC);
 mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
 mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
 mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
 mrec.setOutputFile(Videopath);
 mrec.setPreviewDisplay(surfaceHolder.getSurface());   
 mrec.prepare();
 isRecording=true;
 mrec.start();
}
//-------------------------------------------------------------
protected void stopRecording() 
{

    releaseOnExit();
     mCamera = Camera.open();
     mCamera.lock();  
     surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
     surfaceHolder = surfaceView.getHolder();
     surfaceHolder.addCallback(this);
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

     Parameters params = mCamera.getParameters();
    mCamera.setParameters(params);
    mCamera.setDisplayOrientation(90);
    try {
        mCamera .setPreviewDisplay(surfaceHolder);
    } 
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mCamera .startPreview();
    btnlistToggle.setEnabled(true);
}
//-------------------------------------------------------------
@Override
public void surfaceCreated(SurfaceHolder holder) 
{

     if (mCamera != null)
       {
          Parameters params = mCamera.getParameters();
          mCamera.setParameters(params);
          mCamera.setDisplayOrientation(90);
          try {
            mCamera .setPreviewDisplay(holder);
        } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          mCamera .startPreview();

       }
       else
       {
          Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show();
         VideoRecorderActivity.this.finish();
       }


}

我的应用也有视频播放器。但是当我播放录制的视频时,视频会旋转90度,这对于显示效果不佳。我在Windows上播放由KMplayer录制的视频但视频在那里有90度旋转。而且我必须告诉我使用SurfaceView作为玩家。我该如何解决? 我或其他用户有必要阅读这篇文章。

4 个答案:

答案 0 :(得分:4)

预览方向取决于设备的方向和相机方向。

基本上您需要的是根据这些条件计算相机预览的方向。

我们需要两种帮助方法:

1 - 计算设备方向:

public int getDeviceOrientation(Context context) {

    int degrees = 0;
    WindowManager windowManager =
            (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    int rotation = windowManager.getDefaultDisplay().getRotation();

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

    return degrees;
}  

2 - 计算相机预览旋转:

public static int getPreviewOrientation(Context context, int cameraId) {

   int temp = 0;
   int previewOrientation = 0;

   Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
   Camera.getCameraInfo(cameraId, cameraInfo);

   int deviceOrientation = getDeviceOrientation(context);
   temp = cameraInfo.orientation - deviceOrientation + 360;
   previewOrientation = temp % 360;

    return previewOrientation;
}

在您的代码中,在mediaRecorder.prepare();

之前
int rotation = getPreviewOrientation(context, cameraId);
mediaRecorder.setOrientationHint(rotation);

要使用这些方法,需要使用上下文和相机ID。

获取后置摄像头的摄像头ID:

public int getCamaraBackId(){

    numberOfCameras = Camera.getNumberOfCameras();

    CameraInfo cameraInfo = new CameraInfo();
    for (int i = 0; i < numberOfCameras; i++) {
        Camera.getCameraInfo(i, cameraInfo);
        if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
            return i;
        }
    }
    return -1 // Device do not have back camera !!!!???
}

使用Camera.open(getCamaraBackId());

打开相机

有关详细信息,请参阅Android documentation

答案 1 :(得分:1)

我知道你的问题,

来自Media Recorder的视频使用Camera,因此您需要rotate Media Recorder。使用以下代码应解决您的问题。

/**
 * 
 * @param mMediaRecorder
 * @return
 */
public static MediaRecorder rotateBackVideo(MediaRecorder mMediaRecorder) {
    /**
     * Define Orientation of video in here,
     * if in portrait mode, use value = 90,
     * if in landscape mode, use value = 0
     */
    switch (CustomCamera.current_orientation) {
        case 0:
            mMediaRecorder.setOrientationHint(90);
            break;
        case 90:
            mMediaRecorder.setOrientationHint(180);
            break;
        case 180:
            mMediaRecorder.setOrientationHint(270);
            break;
        case 270:
            mMediaRecorder.setOrientationHint(0);
            break;
    }

    return mMediaRecorder;
}

应在prepare()方法之前添加:

// Step 5: Set the preview output
    /**
     * Define Orientation of image in here,
     * if in portrait mode, use value = 90,
     * if in landscape mode, use value = 0
     */
    CustomCamera.mMediaRecorder = Utils.rotateBackVideo(CustomCamera.mMediaRecorder);
    CustomCamera.mMediaRecorder.setPreviewDisplay(mCameraPreview.getHolder().getSurface());

谢谢

答案 2 :(得分:0)

将此用于MediaRecorder。

   mrec.setOrientationHint(90);

查看documentation

答案 3 :(得分:0)

mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mrec.setOutputFile(Videopath);
mrec.setPreviewDisplay(surfaceHolder.getSurface());   
mrec.setOrientationHint(90);
mrec.prepare();