Android竖屏录制视频

Android的MediaRecorder除了可以用于录制音频之外,还可以用于录制视频。现在网上有很多demo是关于这方面的,但是本屌在参考学习的时候发现,这些demo大多数都是横屏的,换句话说就是竖屏录制视频的时候预览图像的方向旋转了90度。本屌在参阅部分资料并参考了几个demo之后,在自己的项目中解决了这个问题,下面给大家分享一下。

 

 
  1. start.setOnClickListener(new OnClickListener() {

  2.  
  3. @SuppressLint("NewApi")

  4. public void onClick(View v) {

  5. // TODO Auto-generated method stub

  6. try

  7. {

  8. mRecorder=new MediaRecorder();

  9. mRecorder.reset();

  10. //设置摄像头以及摄像头的方向

  11. int CammeraIndex=FindBackCamera();//网上参考的一个函数,用来获取后置摄像头的info

  12. mCamera=Camera.open(CammeraIndex);

  13. mCamera.setDisplayOrientation(90);

  14. mCamera.unlock();

  15. mRecorder.setCamera(mCamera);

  16.  
  17. //设置从麦克风采集声音

  18. mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

  19. //设置从摄像头采集图像

  20. mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

  21. //设置视频文件的输出格式

  22. //必须在设置声音编码格式、图像编码格式之前设置

  23. mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

  24. //设置声音编码格式

  25. mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

  26. //设置图像编码格式

  27. mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

  28. //mRecorder.setVideoSize(320, 280);

  29. //每秒4帧

  30. //mRecorder.setVideoFrameRate(4);

  31. mRecorder.setOutputFile(Environment.getExternalStorageDirectory()+"/myvideo.mp4");

  32. //设置录制视频的方向

  33. mRecorder.setOrientationHint(90);

  34. //指定使用SurfaceView来预览视频

  35. mRecorder.setPreviewDisplay(sView.getHolder().getSurface());

  36. mRecorder.prepare();

  37. //开始录制

  38. mRecorder.start();

  39. System.out.println("---开始录制---");

  40. Toast.makeText(getApplicationContext(), "开始", Toast.LENGTH_SHORT).show();

  41. //让start按钮不可用

  42. start.setEnabled(false);

  43. //让stop按钮可用

  44. stop.setEnabled(true);

  45. isRecording=true;

  46. }

  47. catch(Exception e)

  48. {

  49. e.printStackTrace();

  50. }

  51. }

  52. });

其中的

mCamera.setDisplayOrientation(90);

就是修改摄像头方向的代码,而

mRecorder.setOrientationHint(90);

这句是调整录制视频时的方向。简单解释一下就是,如果你将camera的方向设为90,而将mediarecorder的方向设为270,那么你在录制视频时预览方向是竖屏的,但是当你录好视频播放时,就会发现视频实际上是倒着的。

 

 

另附写得不好的xml文件

 

 
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3. android:layout_width="match_parent"

  4. android:layout_height="match_parent"

  5. android:orientation="vertical" >

  6.  
  7.  
  8. <LinearLayout

  9. android:id="@+id/takevideo"

  10. android:layout_width="fill_parent"

  11. android:layout_height="wrap_content"

  12. android:orientation="horizontal"

  13. android:layout_alignParentBottom="true">

  14. <Button

  15. android:id="@+id/takestop"

  16. android:layout_width="0dp"

  17. android:layout_height="wrap_content"

  18. android:layout_weight="1.0"

  19. android:gravity="center"

  20. android:text="停止"

  21. android:textSize="20sp"/>

  22.  
  23. <Button

  24. android:id="@+id/takestart"

  25. android:layout_width="0dp"

  26. android:layout_height="wrap_content"

  27. android:layout_weight="1.0"

  28. android:gravity="center"

  29. android:text="开始"

  30. android:textSize="20sp"/>

  31.  
  32. <Button

  33. android:id="@+id/takecancel"

  34. android:layout_width="0dp"

  35. android:layout_height="wrap_content"

  36. android:layout_weight="1.0"

  37. android:gravity="center"

  38. android:text="取消"

  39. android:textSize="20sp"/>

  40. </LinearLayout>

  41.  
  42. <SurfaceView

  43. android:id="@+id/video"

  44. android:layout_width="fill_parent"

  45. android:layout_height="fill_parent"

  46. android:layout_above="@id/takevideo"/>

  47. </RelativeLayout>

以及获取摄像头信息的函数(感谢网上某大神的demo,具体是谁忘了,在此谢过!)

 
  1. @SuppressLint("NewApi")

  2. private int FindFrontCamera(){

  3. int cameraCount = 0;

  4. Camera.CameraInfo cameraInfo = new Camera.CameraInfo();

  5. cameraCount = Camera.getNumberOfCameras(); // get cameras number

  6.  
  7. for ( int camIdx = 0; camIdx < cameraCount;camIdx++ ) {

  8. Camera.getCameraInfo( camIdx, cameraInfo ); // get camerainfo

  9. if ( cameraInfo.facing ==Camera.CameraInfo.CAMERA_FACING_FRONT ) {

  10. // 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置

  11. return camIdx;

  12. }

  13. }

  14. return -1;

  15. }

  16. //判断后置摄像头是否存在

  17. @SuppressLint("NewApi")

  18. private int FindBackCamera(){

  19. int cameraCount = 0;

  20. Camera.CameraInfo cameraInfo = new Camera.CameraInfo();

  21. cameraCount = Camera.getNumberOfCameras(); // get cameras number

  22.  
  23. for ( int camIdx = 0; camIdx < cameraCount;camIdx++ ) {

  24. Camera.getCameraInfo( camIdx, cameraInfo ); // get camerainfo

  25. if ( cameraInfo.facing ==Camera.CameraInfo.CAMERA_FACING_BACK ) {

  26. // 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置

  27. return camIdx;

  28. }

  29. }

  30. return -1;

  31. }

别忘了在manifest中添加权限

 

 
  1. <!-- 录制音频 -->

  2. <uses-permission android:name="android.permission.RECORD_AUDIO"/>

  3. <!-- 使用摄像头 -->

  4. <uses-permission android:name="android.permission.CAMERA"/>

  5.  
  6. <!-- -->

  7. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

  8. <!-- 外部存储器 -->

  9. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值