Android音视频录制类MediaRecorder用法举例

转自:http://blog.csdn.net/ameyume/article/details/7884118

MediaRecorder可以实现录音和录像。

MediaRecorder官方说明:

http://developer.android.com/reference/android/media/MediaRecorder.html

使用MediaRecorder录音录像时需要严格遵守API说明中的函数调用先后顺序,否则不能成功执行。

下面是MediaRecorder实现录像的例子。

此程序在高通MSM7225平台的华为U8500 2.2版本上可以正常录像。但在MTK MT6575平台的联想A750上不能正常运行,无法实现录像。

在展讯8810 2.3.5平台可以实现录像,但播放没有声音,通过mediaInfo查看,已经有视频数据了,但是无法播放,在PC上也不能播放,可能是录制的时候出现了问题。

可见,通过camera录像的程序对平台和硬件的依赖性很强,同样的程序在不同的手机上表现差别很大。

1.Activity类

[java]  view plain  copy
  1. public class MainActivity extends Activity implements SurfaceHolder.Callback {  
  2.   
  3.     private static final String TAG = "MainActivity";  
  4.     private SurfaceView mSurfaceview;  
  5.     private Button mBtnStartStop;  
  6.     private boolean mStartedFlg = false;  
  7.     private MediaRecorder mRecorder;  
  8.     private SurfaceHolder mSurfaceHolder;   
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.           
  14.         requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏   
  15.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,   
  16.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏   
  17.   
  18.         // 设置横屏显示   
  19.         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);   
  20.   
  21.         // 选择支持半透明模式,在有surfaceview的activity中使用。   
  22.         getWindow().setFormat(PixelFormat.TRANSLUCENT);   
  23.   
  24.         setContentView(R.layout.activity_main);  
  25.           
  26.         mSurfaceview  = (SurfaceView)findViewById(R.id.surfaceview);  
  27.         mBtnStartStop = (Button)findViewById(R.id.btnStartStop);  
  28.         mBtnStartStop.setOnClickListener(new OnClickListener() {  
  29.   
  30.             @Override  
  31.             public void onClick(View v) {  
  32.                 // TODO Auto-generated method stub  
  33.                 if (!mStartedFlg) {  
  34.                     // Start  
  35.                     if (mRecorder == null) {  
  36.                         mRecorder = new MediaRecorder(); // Create MediaRecorder  
  37.                     }  
  38.                     try {  
  39.   
  40.                         // Set audio and video source and encoder  
  41.                         // 这两项需要放在setOutputFormat之前  
  42.                         mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);  
  43.                         mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);  
  44.                           
  45.                         // Set output file format  
  46.                         mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  47.                           
  48.                         // 这两项需要放在setOutputFormat之后  
  49.                         mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  50.                         mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);  
  51.                           
  52.                         mRecorder.setVideoSize(320240);  
  53.                         mRecorder.setVideoFrameRate(20);  
  54.                         mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());   
  55.                           
  56.                         // Set output file path   
  57.                         String path = getSDPath();  
  58.                         if (path != null) {  
  59.                               
  60.                             File dir = new File(path + "/recordtest");  
  61.                             if (!dir.exists()) {  
  62.                                 dir.mkdir();  
  63.                             }  
  64.                             path = dir + "/" + getDate() + ".3gp";  
  65.                             mRecorder.setOutputFile(path);  
  66.                             Log.d(TAG, "bf mRecorder.prepare()");  
  67.                             mRecorder.prepare();  
  68.                             Log.d(TAG, "af mRecorder.prepare()");  
  69.                             Log.d(TAG, "bf mRecorder.start()");  
  70.                             mRecorder.start();   // Recording is now started  
  71.                             Log.d(TAG, "af mRecorder.start()");  
  72.                             mStartedFlg = true;  
  73.                             mBtnStartStop.setText("Stop");  
  74.                             Log.d(TAG, "Start recording ...");  
  75.                         }  
  76.                     } catch (Exception e) {  
  77.                         e.printStackTrace();  
  78.                     }  
  79.                 } else {  
  80.                     // stop  
  81.                     if (mStartedFlg) {  
  82.                         try {  
  83.                             Log.d(TAG, "Stop recording ...");  
  84.                             Log.d(TAG, "bf mRecorder.stop(");  
  85.                             mRecorder.stop();  
  86.                             Log.d(TAG, "af mRecorder.stop(");  
  87.                             mRecorder.reset();   // You can reuse the object by going back to setAudioSource() step  
  88.                             mBtnStartStop.setText("Start");  
  89.                         } catch (Exception e) {  
  90.                             e.printStackTrace();  
  91.                         }  
  92.                     }  
  93.                     mStartedFlg = false// Set button status flag  
  94.                 }  
  95.             }  
  96.               
  97.         });  
  98.           
  99.         SurfaceHolder holder = mSurfaceview.getHolder();// 取得holder   
  100.   
  101.         holder.addCallback(this); // holder加入回调接口   
  102.   
  103.         // setType必须设置,要不出错.   
  104.         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
  105.   
  106.     }  
  107.       
  108.     /**   
  109.      * 获取系统时间   
  110.      * @return   
  111.      */    
  112.     public static String getDate(){  
  113.         Calendar ca = Calendar.getInstance();     
  114.         int year = ca.get(Calendar.YEAR);           // 获取年份     
  115.         int month = ca.get(Calendar.MONTH);         // 获取月份      
  116.         int day = ca.get(Calendar.DATE);            // 获取日     
  117.         int minute = ca.get(Calendar.MINUTE);       // 分      
  118.         int hour = ca.get(Calendar.HOUR);           // 小时      
  119.         int second = ca.get(Calendar.SECOND);       // 秒     
  120.        
  121.         String date = "" + year + (month + 1 )+ day + hour + minute + second;  
  122.         Log.d(TAG, "date:" + date);  
  123.           
  124.         return date;           
  125.     }  
  126.   
  127.     /**   
  128.      * 获取SD path   
  129.      * @return   
  130.      */  
  131.     public String getSDPath(){   
  132.         File sdDir = null;   
  133.         boolean sdCardExist = Environment.getExternalStorageState()   
  134.                 .equals(android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在   
  135.         if (sdCardExist)   
  136.         {   
  137.             sdDir = Environment.getExternalStorageDirectory();// 获取跟目录   
  138.             return sdDir.toString();   
  139.         }  
  140.           
  141.         return null;  
  142.     }  
  143.   
  144.     @Override  
  145.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  146.             int height) {  
  147.         // TODO Auto-generated method stub  
  148.         // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder   
  149.         mSurfaceHolder = holder;   
  150.         Log.d(TAG, "surfaceChanged 1");  
  151.     }  
  152.   
  153.     @Override  
  154.     public void surfaceCreated(SurfaceHolder holder) {  
  155.         // TODO Auto-generated method stub  
  156.         // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder   
  157.         mSurfaceHolder = holder;  
  158.         Log.d(TAG, "surfaceChanged 2");  
  159.     }  
  160.   
  161.     @Override  
  162.     public void surfaceDestroyed(SurfaceHolder holder) {  
  163.         // TODO Auto-generated method stub  
  164.         // surfaceDestroyed的时候同时对象设置为null   
  165.         mSurfaceview = null;   
  166.         mSurfaceHolder = null;   
  167.         if (mRecorder != null) {  
  168.             mRecorder.release(); // Now the object cannot be reused  
  169.             mRecorder = null;  
  170.             Log.d(TAG, "surfaceDestroyed release mRecorder");  
  171.         }  
  172.     }  
  173. }  

2. Layout文件

布局文件只有一个Surface用于显示录制的视频和一个按钮用于控制开始和结束。

[html]  view plain  copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"   
  5.     android:orientation="horizontal">  
  6.   
  7.     <SurfaceView   
  8.          android:id="@+id/surfaceview"   
  9.          android:layout_weight="1"  
  10.          android:layout_width="0dip"   
  11.          android:layout_height="fill_parent" />   
  12.       
  13.     <Button  
  14.         android:id="@+id/btnStartStop"  
  15.         android:layout_width="55dip"  
  16.         android:layout_height="wrap_content"  
  17.         android:layout_gravity="center"  
  18.         android:text="Start"  
  19.         tools:context=".MainActivity" />  
  20.   
  21. </LinearLayout>  

3.Manifest文件增加权限

需要增加使用Camera,Mic,Sd卡的权限,代码如下:

[html]  view plain  copy
  1. <uses-permission android:name="android.permission.CAMERA" >   
  2. </uses-permission>   
  3. <uses-permission android:name="android.permission.RECORD_AUDIO" >   
  4. </uses-permission>   
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >   
  6. </uses-permission>  

你可能感兴趣的:(视频)