Android 中使用MediaRecorder进行录像详解(视频录制)



在这里给出自己的一个测试DEMO,里面注释很详细。简单的视频录制功能.

  1. package com.video;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.pm.ActivityInfo;  
  7. import android.graphics.PixelFormat;  
  8. import android.media.MediaRecorder;  
  9. import android.os.Bundle;  
  10. import android.view.SurfaceHolder;  
  11. import android.view.SurfaceView;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.view.Window;  
  15. import android.view.WindowManager;  
  16. import android.widget.Button;  
  17.   
  18. /** 
  19.  * class name:TestBasicVideo<BR> 
  20.  * class description:一个简单的录制视频例子<BR> 
  21.  * PS:实现基本的录制保存文件 <BR> 
  22.  *  
  23.  * @version 1.00 2011/09/21 
  24.  * @author CODYY)peijiangping 
  25.  */  
  26. public class TestBasicVideo extends Activity implements SurfaceHolder.Callback {  
  27.     private Button start;// 开始录制按钮  
  28.     private Button stop;// 停止录制按钮  
  29.     private MediaRecorder mediarecorder;// 录制视频的类  
  30.     private SurfaceView surfaceview;// 显示视频的控件  
  31.     // 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看  
  32.     // 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口  
  33.     private SurfaceHolder surfaceHolder;  
  34.   
  35.     public void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏  
  38.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  39.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏  
  40.         // 设置横屏显示  
  41.         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  42.         // 选择支持半透明模式,在有surfaceview的activity中使用。  
  43.         getWindow().setFormat(PixelFormat.TRANSLUCENT);  
  44.         setContentView(R.layout.main);  
  45.         init();  
  46.     }  
  47.   
  48.     private void init() {  
  49.         start = (Button) this.findViewById(R.id.start);  
  50.         stop = (Button) this.findViewById(R.id.stop);  
  51.         start.setOnClickListener(new TestVideoListener());  
  52.         stop.setOnClickListener(new TestVideoListener());  
  53.         surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview);  
  54.         SurfaceHolder holder = surfaceview.getHolder();// 取得holder  
  55.         holder.addCallback(this); // holder加入回调接口  
  56.         // setType必须设置,要不出错.  
  57.         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  58.     }  
  59.   
  60.     class TestVideoListener implements OnClickListener {  
  61.   
  62.         @Override  
  63.         public void onClick(View v) {  
  64.             if (v == start) {  
  65.                 mediarecorder = new MediaRecorder();// 创建mediarecorder对象  
  66.                 // 设置录制视频源为Camera(相机)  
  67.                 mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);  
  68.                 // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4  
  69.                 mediarecorder  
  70.                         .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  71.                 // 设置录制的视频编码h263 h264  
  72.                 mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);  
  73.                 // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错  
  74.                 mediarecorder.setVideoSize(176144);  
  75.                 // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错  
  76.                 mediarecorder.setVideoFrameRate(20);  
  77.                 mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());  
  78.                 // 设置视频文件输出的路径  
  79.                 mediarecorder.setOutputFile("/sdcard/love.3gp");  
  80.                 try {  
  81.                     // 准备录制  
  82.                     mediarecorder.prepare();  
  83.                     // 开始录制  
  84.                     mediarecorder.start();  
  85.                 } catch (IllegalStateException e) {  
  86.                     // TODO Auto-generated catch block  
  87.                     e.printStackTrace();  
  88.                 } catch (IOException e) {  
  89.                     // TODO Auto-generated catch block  
  90.                     e.printStackTrace();  
  91.                 }  
  92.             }  
  93.             if (v == stop) {  
  94.                 if (mediarecorder != null) {  
  95.                     // 停止录制  
  96.                     mediarecorder.stop();  
  97.                     // 释放资源  
  98.                     mediarecorder.release();  
  99.                     mediarecorder = null;  
  100.                 }  
  101.             }  
  102.   
  103.         }  
  104.   
  105.     }  
  106.   
  107.     @Override  
  108.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  109.             int height) {  
  110.         // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder  
  111.         surfaceHolder = holder;  
  112.     }  
  113.   
  114.     @Override  
  115.     public void surfaceCreated(SurfaceHolder holder) {  
  116.         // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder  
  117.         surfaceHolder = holder;  
  118.     }  
  119.   
  120.     @Override  
  121.     public void surfaceDestroyed(SurfaceHolder holder) {  
  122.         // surfaceDestroyed的时候同时对象设置为null  
  123.         surfaceview = null;  
  124.         surfaceHolder = null;  
  125.         mediarecorder = null;  
  126.     }  
  127. }  

main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="horizontal" >  
  5.   
  6.     <LinearLayout  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="fill_parent"  
  9.         android:layout_weight="1" >  
  10.   
  11.         <SurfaceView  
  12.             android:id="@+id/surfaceview"  
  13.             android:layout_width="fill_parent"  
  14.             android:layout_height="fill_parent" />  
  15.     </LinearLayout>  
  16.   
  17.     <LinearLayout  
  18.         android:layout_width="fill_parent"  
  19.         android:layout_height="fill_parent"  
  20.         android:layout_weight="4"  
  21.         android:gravity="center"  
  22.         android:orientation="vertical" >  
  23.   
  24.         <Button  
  25.             android:id="@+id/start"  
  26.             android:layout_width="fill_parent"  
  27.             android:layout_height="wrap_content"  
  28.             android:layout_weight="1"  
  29.             android:text="Start" />  
  30.   
  31.         <Button  
  32.             android:id="@+id/stop"  
  33.             android:layout_width="fill_parent"  
  34.             android:layout_height="wrap_content"  
  35.             android:layout_weight="1"  
  36.             android:text="Stop" />  
  37.     </LinearLayout>  
  38.   
  39. </LinearLayout>  

AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.video"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <application  
  8.         android:icon="@drawable/icon"  
  9.         android:label="@string/app_name" >  
  10.         <activity  
  11.             android:label="@string/app_name"  
  12.             android:name=".TestBasicVideo" >  
  13.             <intent-filter >  
  14.                 <action android:name="android.intent.action.MAIN" />  
  15.   
  16.                 <category android:name="android.intent.category.LAUNCHER" />  
  17.             </intent-filter>  
  18.         </activity>  
  19.     </application>  
  20.   
  21.     <uses-sdk android:minSdkVersion="8" />  
  22.   
  23.     <uses-permission android:name="android.permission.CAMERA" >  
  24.     </uses-permission>  
  25.     <uses-permission android:name="android.permission.RECORD_AUDIO" >  
  26.     </uses-permission>  
  27.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >  
  28.     </uses-permission>  
  29.   
  30. </manifest>  

发布了7 篇原创文章 · 获赞 7 · 访问量 27万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览