android – 以纵向模式捕获MediaRecorder视频

前端之家收集整理的这篇文章主要介绍了android – 以纵向模式捕获MediaRecorder视频前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试制作自定义视频应用.我只使用清单2.2中的设置(API 8).

一切顺利,但我不明白为什么肖像模式视频与lanscape视频没有区别.

为了检测设备改变方向,我在surfaceChanged()中使用此代码

  1. if (mCamera != null) {
  2.  
  3. Camera.Parameters p = mCamera.getParameters();
  4.  
  5. try {
  6. mCamera.stopPreview();
  7. } catch (Exception e) {
  8. // TODO: handle exception
  9. }
  10.  
  11. int previewWidth = 0;
  12. int previewHeight = 0;
  13.  
  14. if (mPreviewSize != null) {
  15. Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
  16. int rotation = display.getRotation();
  17.  
  18. switch (rotation) {
  19. case Surface.ROTATION_0:
  20. previewWidth = mPreviewSize.height;
  21. previewHeight = mPreviewSize.width;
  22. mCamera.setDisplayOrientation(90);
  23. break;
  24.  
  25. case Surface.ROTATION_90:
  26. previewWidth = mPreviewSize.width;
  27. previewHeight = mPreviewSize.height;
  28. mCamera.setDisplayOrientation(0);
  29. break;
  30.  
  31. case Surface.ROTATION_180:
  32. previewWidth = mPreviewSize.height;
  33. previewHeight = mPreviewSize.width;
  34. mCamera.setDisplayOrientation(270);
  35. break;
  36.  
  37. case Surface.ROTATION_270:
  38. previewWidth = mPreviewSize.width;
  39. previewHeight = mPreviewSize.height;
  40. mCamera.setDisplayOrientation(180);
  41. break;
  42. }
  43.  
  44. p.setPreviewSize(previewWidth,previewHeight);
  45. mCamera.setParameters(p);
  46. }
  47. try {
  48. mCamera.setPreviewDisplay(mHolder);
  49. mCamera.startPreview();
  50. } catch (Exception e) {
  51. Log.d(TAG,"Cannot start preview.",e);
  52. }
  53. }

奇迹般有效.如果我旋转设备表面更改方向,请调用surfaceChanged,其中camera设置为适当的DisplayRotation.

问题是如何在以后以景观模式或纵向模式捕获视频时如何确定.因为我得到的所有视频都是横向拍摄的.它不依赖于setDisplayOrientation,它只影响预览过程.

同时探索这个问题我注意到如果要使用标准相机应用程序,它会将特殊标签写入视频文件(在MediaInfo中看到):旋转:90为肖像拍摄的视频.

但是MediaRecorder类没有.

似乎这就是问题所在.有人要解决这个问题吗?

解决方法

找到了 !
实际上,你可以改变预览,你可以标记视频,但没有办法真正改变视频…(可能是速度问题或其他)
  1. camera.setDisplayOrientation(90);

要旋转预览,那么

  1. recorder.setOrientationHint(90);

要将视频标记为旋转90°,手机会在阅读时自动旋转.

所以你要做的就是

  1. camera = Camera.open();
  2. //Set preview with a 90° ortientation
  3. camera.setDisplayOrientation(90);
  4. camera.unlock();
  5.  
  6. holder = getHolder();
  7. holder.addCallback(this);
  8. holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  9.  
  10. recorder = new MediaRecorder();
  11. recorder.setCamera(camera);
  12. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  13. recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
  14. recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  15. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  16. recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
  17. recorder.setOutputFile(getVideoFolder()+rnd.nextString()+".mp4");
  18. recorder.setPreviewDisplay(holder.getSurface());
  19. //Tags the video with a 90° angle in order to tell the phone how to display it
  20. recorder.setOrientationHint(90);
  21.  
  22. if (recorder != null) {
  23. try {
  24. recorder.prepare();
  25. } catch (IllegalStateException e) {
  26. Log.e("IllegalStateException",e.toString());
  27. } catch (IOException e) {
  28. Log.e("IOException",e.toString());
  29. }
  30. }
  31.  
  32. recorder.start();

希望能帮助到你

猜你在找的Android相关文章