Android MediaRecorder视频录制
2016-07-03 23:59
489 查看
Android视频录制有两种方法,一种是使用内置的摄像头应用程序,利用Intent启动摄像头,这种比较方便,,但是功能和布局都已经固定了,适合只需简单调用摄像头功能的app。另一种就是利用mediarecorder来自定义app。前面一种比较简单,这里写了一个利用mediarecorder录制视频的demo
先上效果图
MainActivity.java
这里我写了一个内部类MyMediaRecorder继承自MediaRocroder,将各种参数都写好了,可以直接调用。这里需要说一下图像角度的问题,设置为横屏,预览和录制视频都是正常的。但是如果是竖屏,预览和录制视频都是90度旋转,可以将super.setOrientationHint(0)改为super.setOrientationHint(90),这样录制的视频就是正常的了,但是预览时还是有90度旋转,所以直接设置为横屏模式。
activity_main.xml
AndroidManifest.xml里面添加权限
最后还要说一下,在模拟器上录制视频可能会有问题,最好用真机测试。
下面是android studio项目
http://download.csdn.net/detail/amazinguu/9566502
先上效果图
MainActivity.java
package com.example.administrator.mediarecordertest; import android.content.pm.ActivityInfo; import android.media.MediaRecorder; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private SurfaceView sView; private Button btn_start, btn_stop; private MyMediaRecorder mRecorder; private File mVideoFile, mFileFolder; private String path; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sView = (SurfaceView) findViewById(R.id.sv); // 设置横屏显示 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); btn_start = (Button) findViewById(R.id.btn_start); btn_stop = (Button) findViewById(R.id.btn_stop); btn_stop.setEnabled(false);//设置stop不可按 btn_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { // 设置预览分辨率 sView.getHolder().setFixedSize(640, 480); // 设置该组件不会让屏幕自动关闭 sView.getHolder().setKeepScreenOn(true); //创建MyMediaRecord对象 mRecorder = new MyMediaRecorder(640, 480); path = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Video";// 设定存放视频的文件夹的路径 mFileFolder = new File(path); // 声明存放视频的文件夹的File对象 if (!mFileFolder.exists()) { // 如果不存在此文件夹,则创建 mFileFolder.mkdirs(); } String nowTime = java.text.MessageFormat.format( "{0,date,yyyyMMdd_HHmmss}", new Object[]{new java.sql.Date(System.currentTimeMillis())});//得到系统时间,精确到秒,作为录制文件的名字 mVideoFile = new File(mFileFolder.getAbsoluteFile() + File.separator + "video" + nowTime + ".3gp");// 声明视频文件对象 mVideoFile.createNewFile();// 创建此视频文件 // 指定SurfaceView来预览视频 mRecorder.setPreviewDisplay(sView.getHolder().getSurface()); //设置存储文件路径 mRecorder.setOutputFile(mVideoFile.getAbsolutePath()); //以上设置参数有先后顺序,不可随意改变,具体参见MediaRecord类API mRecorder.prepare(); // 开始录制 mRecorder.start(); btn_stop.setEnabled(true);//设置stop可按 btn_start.setEnabled(false);//设置start不可按 } catch (Exception e) { Log.d(TAG, "start failed"); } } }); btn_stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 停止录制 mRecorder.stop(); // 释放资源 mRecorder.release(); mRecorder = null; btn_start.setEnabled(true); btn_stop.setEnabled(false); Toast.makeText(MainActivity.this, "文件存储成功,存放在Video文件夹下", Toast.LENGTH_SHORT).show(); } }); } public class MyMediaRecorder extends MediaRecorder { public MyMediaRecorder(int n, int m) { super.setAudioSource(MediaRecorder.AudioSource.MIC); super.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置视频、音频的输出格式 super.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // 设置音频的编码格式 super.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置图像编码格式 super.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置图像角度 super.setOrientationHint(0); //设置录制文件分辨率 super.setVideoSize(640, 480);//不同机型所支持的分辨率不同,设置的参数和机型支持的不匹配会导致无法录像 //设置帧率 super.setVideoFrameRate(30); //设置编码率 super.setVideoEncodingBitRate(5 * n * m);//上面视频文件的分辨率不能改的情况下,增大这个参数可以使视频清晰,但相应的视频文件会变大 } } }
这里我写了一个内部类MyMediaRecorder继承自MediaRocroder,将各种参数都写好了,可以直接调用。这里需要说一下图像角度的问题,设置为横屏,预览和录制视频都是正常的。但是如果是竖屏,预览和录制视频都是90度旋转,可以将super.setOrientationHint(0)改为super.setOrientationHint(90),这样录制的视频就是正常的了,但是预览时还是有90度旋转,所以直接设置为横屏模式。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.mediarecordertest.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_start" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="start" /> <Button android:id="@+id/btn_stop" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="stop" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/sv" /> </LinearLayout> </LinearLayout>
AndroidManifest.xml里面添加权限
<!-- 授予该程序录制声音的权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 授予该程序使用摄像头的权限 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 授予使用外部存储的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
最后还要说一下,在模拟器上录制视频可能会有问题,最好用真机测试。
下面是android studio项目
http://download.csdn.net/detail/amazinguu/9566502
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories