[多媒体]android MediaRecoder 实现录像机

http://www.cnblogs.com/skyseraph/archive/2012/03/09/2387417.html

啰嗦:前一篇介绍了MediaRecoder实现的录音机:【Android學習專題】多媒體篇:MediaRecorder 实现录音机 ,这篇介绍录像机的实现。

录像界面

[多媒体]android MediaRecoder 实现录像机_第1张图片

关键步骤

开始录像

[多媒体]android MediaRecoder 实现录像机_第2张图片

录像结束

返回

[多媒体]android MediaRecoder 实现录像机_第3张图片

屏幕下方计时实现

完整源码

JAVA源码

复制代码
  1 public class mediarecorder2 extends Activity implements SurfaceHolder.Callback
  2 {
  3     private Button mVideoStartBtn,mVideoStopBtn,mVideoReturnBtn;
  4     private SurfaceView mSurfaceview;         // 显示视频的控件
  5     private MediaRecorder mMediaRecorder;     // MediaRecorder对象,錄製視頻的類
  6     private SurfaceHolder mSurfaceHolder;    // 
  7     private File mRecVedioPath;                // 录制的音視頻文件路徑
  8     private File mRecAudioFile;                // 录制的音視頻文件
  9     private TextView tv01,tv02,tv03,tv04,tv05;
 10     private int hour = 0;
 11     private int minute = 0;
 12     private int second = 0;
 13     private boolean bool;
 14     
 15     @Override
 16     protected void onCreate(Bundle savedInstanceState)
 17     {
 18         super.onCreate(savedInstanceState);
 19         /* 全局Activity设置 */
 20         // 隐去Title(程序的名字)
 21         this.requestWindowFeature(Window.FEATURE_NO_TITLE);
 22         // 設置全屏:隐去电池等图标和一切修饰部分(状态栏部分)
 23         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
 24                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
 25         // 选择支持半透明模式,在有surfaceview的activity中使用。        
 26         getWindow().setFormat(PixelFormat.TRANSLUCENT);
 27         setContentView(R.layout.mymultimedia_mediarecorder2);
 28 
 29         tv01 = (TextView) findViewById(R.id.mediarecorder2_TextView01);
 30         tv02 = (TextView) findViewById(R.id.mediarecorder2_TextView02);
 31         tv03 = (TextView) findViewById(R.id.mediarecorder2_TextView03);
 32         tv04 = (TextView) findViewById(R.id.mediarecorder2_TextView04);
 33         tv05 = (TextView) findViewById(R.id.mediarecorder2_TextView05);        
 34         mVideoStartBtn = (Button) findViewById(R.id.mediarecorder2_VideoStartBtn);
 35         mVideoStopBtn = (Button) findViewById(R.id.mediarecorder2_VideoStopBtn);
 36         mVideoReturnBtn = (Button) findViewById(R.id.mediarecorder2_VideoReturnBtn);
 37         mSurfaceview = (SurfaceView) this.findViewById(R.id.mediarecorder2_Surfaceview);
 38         
 39         //设置TextView不可见
 40         tv01.setVisibility(View.GONE);
 41         tv02.setVisibility(View.GONE);
 42         tv03.setVisibility(View.GONE);
 43         tv04.setVisibility(View.GONE);
 44         tv05.setVisibility(View.GONE);
 45         
 46         /* 检测是否存在SD卡 */
 47         if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
 48         {
 49             mRecVedioPath = Environment.getExternalStorageDirectory();// 得到SD卡得路径            
 50         } else
 51         {
 52             Toast.makeText(mediarecorder2.this, "没有SD卡", Toast.LENGTH_LONG).show();
 53         }        
 54 
 55         //
 56         SurfaceHolder holder = mSurfaceview.getHolder();        // 取得holder
 57         holder.addCallback(mediarecorder2.this);                 // holder加入回调接口
 58         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 設置顯示器類型,setType必须设置
 59 
 60 // 按钮状态
 61         mVideoStartBtn.setEnabled(true);
 62         mVideoStopBtn.setEnabled(false);
 63 
 64         // 開始
 65         mVideoStartBtn.setOnClickListener(new Button.OnClickListener()
 66         {
 67             @Override
 68             public void onClick(View v)
 69             {
 70                 bool = true;
 71                 /* ①Initial:实例化MediaRecorder对象 */
 72                 if(mMediaRecorder == null)
 73                     mMediaRecorder = new MediaRecorder();
 74                 else
 75                     mMediaRecorder.reset();
 76                 /* 解決豎屏視頻被旋轉90°的錯誤 
 77                 Camera c = Camera.open();
 78                 Camera.Parameters parameters = c.getParameters();
 79                 parameters.setRotation(90);
 80                 c.setParameters(parameters); 
 81                 c.unlock();        
 82                 mMediaRecorder.setCamera(c);*/
 83                 // 預覽
 84                 mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
 85                 /* ②setAudioSource/setVedioSource */
 86                 mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 设置Camera(相机)
 87                 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 88                 /* ②设置錄製視頻输出格式:THREE_GPP/MPEG-4/RAW_AMR/Default
 89                  * THREE_GPP(3gp格式,H263视频ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)*/
 90                 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
 91                 /* ②设置視頻/音频文件的编码:AAC/AMR_NB/AMR_MB/Default */
 92                 mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
 93                 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 94                 /* ②设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错 */
 95                 mMediaRecorder.setVideoSize(176, 144);
 96                 /* ②设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错 */
 97                 mMediaRecorder.setVideoFrameRate(15);                
 98                 /* ②设置输出文件的路径 */                
 99                 try
100                 {
101                     mRecAudioFile = File.createTempFile("Vedio",".3gp",mRecVedioPath);
102                 } catch (IOException e1)
103                 {
104                     // TODO Auto-generated catch block
105                     e1.printStackTrace();
106                 }
107                 mMediaRecorder.setOutputFile(mRecAudioFile.getAbsolutePath());
108                 try
109                 {     
110                     /* ③准备 */
111                     mMediaRecorder.prepare();
112                     tv01.setVisibility(View.VISIBLE);
113                     tv02.setVisibility(View.VISIBLE);
114                     tv03.setVisibility(View.VISIBLE);
115                     tv04.setVisibility(View.VISIBLE);
116                     tv05.setVisibility(View.VISIBLE);
117                     handler.postDelayed(task, 1000);
118                     /* ④开始 */
119                     mMediaRecorder.start();
120                     /* 按钮状态 */
121                     mVideoStartBtn.setEnabled(false);
122                     mVideoStopBtn.setEnabled(true);
123                     mVideoReturnBtn.setEnabled(true);
124                 } catch (Exception e)
125                 {
126                     e.printStackTrace();
127                 }
128             }
129         });
130         // 結束
131         mVideoStopBtn.setOnClickListener(new Button.OnClickListener()
132         {
133             @Override
134             public void onClick(View v)
135             {                
136                 if (mMediaRecorder != null)
137                 {
138                     /* ⑤停止录音 */
139                     mMediaRecorder.stop();
140                     bool = false;
141                     tv01.setText(format(hour));
142                     tv03.setText(format(minute));
143                     tv05.setText(format(second));
144                     /* ⑥释放MediaRecorder */
145                     mMediaRecorder.release();
146                     mMediaRecorder = null;
147                     /* 按钮状态 */
148                     mVideoStartBtn.setEnabled(true);
149                     mVideoStopBtn.setEnabled(false);
150                     mVideoReturnBtn.setEnabled(true);
151                 }
152             }
153         });
154         //  返回
155         mVideoReturnBtn.setOnClickListener(new Button.OnClickListener()
156         {
157             @Override
158             public void onClick(View v)
159             {
160                 if(mMediaRecorder != null)
161                 {
162                     mMediaRecorder.stop();
163                     mMediaRecorder.release();
164                     mMediaRecorder = null;
165                 }
166                 finish();
167             }
168         });
169     }
170 
171     @Override
172     public void surfaceCreated(SurfaceHolder holder)
173     {
174         // TODO Auto-generated method stub
175         mSurfaceHolder = holder;
176     }
177 
178     @Override
179     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
180     {
181         // TODO Auto-generated method stub
182         mSurfaceHolder = holder;
183     }
184 
185     @Override
186     public void surfaceDestroyed(SurfaceHolder holder)
187     {
188         // TODO Auto-generated method stub
189         mSurfaceview = null;
190         mSurfaceHolder = null;
191         mMediaRecorder = null;
192     }
193     
194     
195     /*定时器设置,实现计时*/    
196     private Handler handler = new Handler();
197     private Runnable task = new Runnable()
198     {
199         public void run()
200         {
201             if (bool)
202             {
203                 handler.postDelayed(this, 1000);
204                 second++;
205                 if (second < 60)
206                 {
207                     tv05.setText(format(second));
208                 } else if (second < 3600)
209                 {
210                     minute = second / 60;
211                     second = second % 60;
212                     tv03.setText(format(minute));
213                     tv05.setText(format(second));
214                 } else
215                 {
216                     hour = second / 3600;
217                     minute = (second % 3600) / 60;
218                     second = (second % 3600) % 60;
219                     tv01.setText(format(hour));
220                     tv03.setText(format(minute));
221                     tv05.setText(format(second));
222                 }
223             }
224         }
225     };
226     
227     /* 格式化时间*/    
228     public String format(int i)
229     {
230         String s = i + "";
231         if (s.length() == 1)
232         {
233             s = "0" + s;
234         }
235         return s;
236     }
237 }
复制代码

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="vertical" >
  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/mediarecorder2_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="5"
 21         android:gravity="center"
 22         android:orientation="vertical" >
 23 
 24         <AbsoluteLayout
 25 android:layout_width="fill_parent"
 26             android:layout_height="fill_parent"
 27             android:layout_weight="2" >
 28 
 29             <TextView
 30 android:id="@+id/mediarecorder2_TextView01"
 31                 android:layout_width="40px"
 32                 android:layout_height="40px"
 33                 android:layout_x="5px"
 34                 android:layout_y="1px"
 35                 android:text="00"
 36                 android:textColor="#ffff0000"
 37                 android:textStyle="bold" >
 38             </TextView>
 39             
 40             <TextView
 41 android:id="@+id/mediarecorder2_TextView02"
 42                 android:layout_width="20px"
 43                 android:layout_height="40px"
 44                 android:layout_x="25px"
 45                 android:layout_y="1px"
 46                 android:text=":"
 47                 android:textColor="#ffff0000"
 48                 android:textStyle="bold" >
 49             </TextView>
 50             
 51             <TextView
 52 android:id="@+id/mediarecorder2_TextView03"
 53                 android:layout_width="40px"
 54                 android:layout_height="40px"
 55                 android:layout_x="35px"
 56                 android:layout_y="1px"
 57                 android:text="00"
 58                 android:textColor="#ffff0000"
 59                 android:textStyle="bold" >
 60             </TextView>
 61             
 62             <TextView
 63 android:id="@+id/mediarecorder2_TextView04"
 64                 android:layout_width="20px"
 65                 android:layout_height="40px"
 66                 android:layout_x="55px"
 67                 android:layout_y="1px"
 68                 android:text=":"
 69                 android:textColor="#ffff0000"
 70                 android:textStyle="bold" >
 71             </TextView>
 72             
 73             <TextView
 74 android:id="@+id/mediarecorder2_TextView05"
 75                 android:layout_width="40px"
 76                 android:layout_height="40px"                
 77                 android:layout_x="65px"
 78                 android:layout_y="1px"
 79                 android:text="00"
 80                 android:textColor="#ffff0000"
 81                 android:textStyle="bold" >
 82             </TextView>
 83             
 84             <TextView
 85 android:layout_width="wrap_content"
 86                 android:layout_height="wrap_content"
 87                 android:layout_x="350dp"
 88                 android:layout_y="1dp"
 89                 android:text="SkySeraph"
 90                 android:textColor="#ffff00"
 91                 android:textStyle="bold" >
 92             </TextView>
 93            
 94         </AbsoluteLayout>
 95 
 96         <LinearLayout
 97 android:layout_width="fill_parent"
 98             android:layout_height="fill_parent"
 99             android:layout_weight="1"
100             android:gravity="center"
101             android:orientation="horizontal" >
102 
103             <Button
104 android:id="@+id/mediarecorder2_VideoStartBtn"
105                 android:layout_width="fill_parent"
106                 android:layout_height="fill_parent"
107                 android:layout_weight="1"
108                 android:background="@layout/button1"
109                 android:text="Start" />
110 
111             <Button
112 android:id="@+id/mediarecorder2_VideoStopBtn"
113                 android:layout_width="fill_parent"
114                 android:layout_height="fill_parent"
115                 android:layout_weight="1"
116                 android:background="@layout/button1"
117                 android:text="Stop" />
118             
119             <Button
120 android:id="@+id/mediarecorder2_VideoReturnBtn"
121                 android:layout_width="fill_parent"
122                 android:layout_height="fill_parent"
123                 android:layout_weight="1"
124                 android:background="@layout/button2"
125                 android:text="Return" />
126         </LinearLayout>
127     </LinearLayout>
128 
129 </LinearLayout>
复制代码

Refs

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

2 http://blog.csdn.net/iamlazybone/article/details/5764118

3 http://blog.sina.com.cn/s/blog_6111ce890100pouu.html

4 http://blog.csdn.net/peijiangping1989/article/details/7049991

5 http://www.codeproject.com/Articles/107270/Recording-and-Playing-Video-on-Android




作者:skyseraph
出处:http://www.cnblogs.com/skyseraph/
Email/GTalk: [email protected]
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。



你可能感兴趣的:([多媒体]android MediaRecoder 实现录像机)