我正在尝试制作自定义视频应用.我只使用清单2.2中的设置(API 8).
一切顺利,但我不明白为什么肖像模式视频与lanscape视频没有区别.
为了检测设备改变方向,我在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); } }
奇迹般有效.如果我旋转设备表面更改方向,请调用surfaceChanged,其中camera设置为适当的DisplayRotation.
问题是如何在以后以景观模式或纵向模式捕获视频时如何确定.因为我得到的所有视频都是横向拍摄的.它不依赖于setDisplayOrientation,它只影响预览过程.
同时探索这个问题我注意到如果要使用标准相机应用程序,它会将特殊标签写入视频文件(在MediaInfo中看到):旋转:90为肖像拍摄的视频.
但是MediaRecorder类没有.
似乎这就是问题所在.有人要解决这个问题吗?
解决方法
找到了 !
实际上,你可以改变预览,你可以标记视频,但没有办法真正改变视频…(可能是速度问题或其他)
实际上,你可以改变预览,你可以标记视频,但没有办法真正改变视频…(可能是速度问题或其他)
camera.setDisplayOrientation(90);
要旋转预览,那么
recorder.setOrientationHint(90);
所以你要做的就是
camera = Camera.open(); //Set preview with a 90° ortientation camera.setDisplayOrientation(90); camera.unlock(); holder = getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); recorder = new MediaRecorder(); recorder.setCamera(camera); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); recorder.setOutputFile(getVideoFolder()+rnd.nextString()+".mp4"); recorder.setPreviewDisplay(holder.getSurface()); //Tags the video with a 90° angle in order to tell the phone how to display it recorder.setOrientationHint(90); if (recorder != null) { try { recorder.prepare(); } catch (IllegalStateException e) { Log.e("IllegalStateException",e.toString()); } catch (IOException e) { Log.e("IOException",e.toString()); } } recorder.start();
希望能帮助到你