转:android 录制视频的Demo

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

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

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

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. <LinearLayout
  6. android:layout_width="fill_parent"
  7. android:layout_height="fill_parent"
  8. android:layout_weight="1" >
  9. <SurfaceView
  10. android:id="@+id/surfaceview"
  11. android:layout_width="fill_parent"
  12. android:layout_height="fill_parent" />
  13. </LinearLayout>
  14. <LinearLayout
  15. android:layout_width="fill_parent"
  16. android:layout_height="fill_parent"
  17. android:layout_weight="4"
  18. android:gravity="center"
  19. android:orientation="vertical" >
  20. <Button
  21. android:id="@+id/start"
  22. android:layout_width="fill_parent"
  23. android:layout_height="wrap_content"
  24. android:layout_weight="1"
  25. android:text="Start" />
  26. <Button
  27. android:id="@+id/stop"
  28. android:layout_width="fill_parent"
  29. android:layout_height="wrap_content"
  30. android:layout_weight="1"
  31. android:text="Stop" />
  32. </LinearLayout>
  33. </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. <application
    7. android:icon="@drawable/icon"
    8. android:label="@string/app_name" >
    9. <activity
    10. android:label="@string/app_name"
    11. android:name=".TestBasicVideo" >
    12. <intent-filter >
    13. <action android:name="android.intent.action.MAIN" />
    14. <category android:name="android.intent.category.LAUNCHER" />
    15. </intent-filter>
    16. </activity>
    17. </application>
    18. <uses-sdk android:minSdkVersion="8" />
    19. <uses-permission android:name="android.permission.CAMERA" >
    20. </uses-permission>
    21. <uses-permission android:name="android.permission.RECORD_AUDIO" >
    22. </uses-permission>
    23. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    24. </uses-permission>
    25. </manifest>
上一篇:CentOS中对ext4文件系统做磁盘配额


下一篇:关闭ext4文件系统的日志功能