免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2249 | 回复: 1
打印 上一主题 下一主题

[Android] 安卓用MediaRecorder视频录像的一些问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-26 20:15 |只看该作者 |倒序浏览
最近初学安卓开发,然后做了个录像程序,用的是MediaRecorder,一共2个按钮,一个录像,一个停止录像,自己实现了一个类 MovieRecorder,里面有录像和停止录像两块功能,按钮事件触发分别调用类中的两个成员函数,但是现在问题是,我在按下录像的时候可以进行录像,但是在按下停止录像的时候事件已经触发,但是停止不了录像,不知道怎么回事,以下是我的代码,求各位大神帮忙看一下,谢谢!
这里是Activity_main的:
  1. package com.example.sandao.cameraupload2;

  2. import android.media.MediaRecorder;
  3. import android.os.Environment;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.support.v7.app.ActionBarActivity;
  7. import android.os.Bundle;
  8. import android.view.Menu;
  9. import android.view.MenuInflater;
  10. import android.view.MenuItem;
  11. import android.view.SubMenu;
  12. import android.view.SurfaceView;
  13. import android.view.View;
  14. import android.widget.ImageButton;
  15. import android.widget.Toast;

  16. import java.io.File;


  17. public class MainActivity extends ActionBarActivity {
  18.     // 程序中的两个按钮
  19.     ImageButton record , stop , upload;
  20.     // 显示视频预览的SurfaceView
  21.     SurfaceView sView;
  22.     MovieRecorder movierecorder;

  23.     @Override
  24.     protected void onCreate(Bundle savedInstanceState) {
  25.         super.onCreate(savedInstanceState);
  26.         setContentView(R.layout.activity_main);
  27.         movierecorder = new MovieRecorder();
  28.         // 获取程序界面中的三个按钮
  29.         record = (ImageButton) findViewById(R.id.record);
  30.         stop = (ImageButton) findViewById(R.id.stop);
  31.         upload = (ImageButton) findViewById(R.id.upload);
  32.         if (!Environment.getExternalStorageState().equals(
  33.                 android.os.Environment.MEDIA_MOUNTED))
  34.         {
  35.             Toast.makeText(MainActivity.this
  36.                     , "SD卡不存在,请插入SD卡!"
  37.                     , Toast.LENGTH_SHORT).show();
  38.             return;
  39.         }
  40.         File sd=Environment.getExternalStorageDirectory();
  41.         String path=sd.getPath()+"/Camera_upload";
  42.         File file=new File(path);
  43.         if(!file.exists())
  44.         {
  45.             Toast.makeText(MainActivity.this
  46.                     , "存储目录不存在,创建目录!"
  47.                     , Toast.LENGTH_SHORT).show();
  48.             file.mkdir();
  49.         }
  50.         // 让stop按钮不可用
  51.         stop.setEnabled(false);
  52.         // 获取程序界面中的SurfaceView
  53.         sView = (SurfaceView) this.findViewById(R.id.sView);
  54.         // 设置分辨率
  55.         sView.getHolder().setFixedSize(320, 280);
  56.         // 设置该组件让屏幕不会自动关闭
  57.         sView.getHolder().setKeepScreenOn(true);
  58.     }

  59.     public boolean onCreateOptionsMenu(Menu menu)
  60.     {
  61.         MenuInflater inflator = new MenuInflater(this);
  62.         //装填R.menu.my_menu对应的菜单,并添加到menu中
  63.         inflator.inflate(R.menu.menu_main, menu);
  64.         return super.onCreateOptionsMenu(menu);
  65.     }

  66.     public void RecorderHandler(View source)
  67.     {
  68.         Toast.makeText(MainActivity.this
  69.                 , "单击了recorder键!"
  70.                 , Toast.LENGTH_SHORT).show();
  71.         record = (ImageButton) findViewById(R.id.record);
  72.         stop = (ImageButton) findViewById(R.id.stop);
  73.         movierecorder.startRecording(sView,record,stop);
  74.     }

  75.     public void StopHandler(View source)
  76.     {
  77.         movierecorder.stopRecording();
  78.     }

  79.     public void UploadHandler(View source)
  80.     {
  81.         Toast.makeText(MainActivity.this
  82.                 , "单击了Upload键!"
  83.                 , Toast.LENGTH_SHORT).show();
  84.     }
  85. }
复制代码
这是我自己的类, MovieRecorder:
  1. package com.example.sandao.cameraupload2;

  2. import android.hardware.Camera;
  3. import android.media.MediaRecorder;
  4. import android.view.SurfaceView;
  5. import android.widget.ImageButton;

  6. import java.io.File;
  7. import java.io.IOException;
  8. import java.util.Timer;
  9. import java.util.TimerTask;

  10. import static com.example.sandao.cameraupload2.MainActivity.*;

  11. /**
  12. * Created by Administrator on 2015/9/26 0026.
  13. */
  14. public class MovieRecorder{
  15.     private MediaRecorder mRecorder;
  16.     boolean isRecording;
  17.     File videoFile ;
  18.     ImageButton record , stop;


  19.     public void startRecording(SurfaceView surfaceView,ImageButton mainrecord,ImageButton mainstop) {

  20.             // 创建MediaRecorder对象
  21.             mRecorder = new MediaRecorder();
  22.             record = mainrecord;
  23.             stop = mainstop;
  24.             // 创建保存录制视频的视频文件
  25.             videoFile = new File("/mnt/sdcard/Camera_upload/myvideo.3gp");
  26.             mRecorder.reset();
  27.             //调转摄像头
  28.             Camera c = Camera.open();
  29.             c.setDisplayOrientation(90);
  30.             c.unlock();
  31.             mRecorder.setCamera(c);
  32.             // 设置从麦克风采集声音
  33.             mRecorder.setAudioSource(MediaRecorder
  34.                     .AudioSource.MIC);
  35.             // 设置从摄像头采集图像
  36.             mRecorder.setVideoSource(MediaRecorder
  37.                     .VideoSource.CAMERA);
  38.             // 设置视频文件的输出格式
  39.             // 必须在设置声音编码格式、图像编码格式之前设置
  40.             mRecorder.setOutputFormat(MediaRecorder
  41.                     .OutputFormat.MPEG_4);
  42.             // 设置声音编码的格式
  43.             mRecorder.setAudioEncoder(MediaRecorder
  44.                     .AudioEncoder.DEFAULT);
  45.             // 设置图像编码的格式
  46.             mRecorder.setVideoEncoder(MediaRecorder
  47.                     .VideoEncoder.MPEG_4_SP);
  48.             mRecorder.setVideoSize(320, 240);
  49.             // 每秒 20帧
  50.             //mRecorder.setVideoFrameRate(10);
  51.             mRecorder.setOutputFile(videoFile.getAbsolutePath());
  52.             // 指定使用SurfaceView来预览视频
  53.             mRecorder.setPreviewDisplay(surfaceView
  54.                     .getHolder().getSurface());
  55.         try{
  56.             mRecorder.prepare();
  57.             // 开始录制
  58.             mRecorder.start();
  59.             System.out.println("---recording---");
  60.             // 让record按钮不可用
  61.             record.setEnabled(false);
  62.             // 让stop按钮可用
  63.             stop.setEnabled(true);
  64.         } catch (Exception e) {
  65.             e.printStackTrace();
  66.         }
  67.         isRecording = true;
  68.     }

  69.     public void stopRecording()
  70.     {
  71.            if(mRecorder != null) {
  72.                // 停止录制
  73.                mRecorder.stop();
  74.                // 释放资源
  75.                mRecorder.release();
  76.                mRecorder = null;
  77.                // 让record按钮可用
  78.                record.setEnabled(true);
  79.                // 让stop按钮不可用
  80.                stop.setEnabled(false);
  81.            }
  82.     }
  83. }
复制代码

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-10-06 06:20:00
2 [报告]
发表于 2015-10-03 14:49 |只看该作者
真的不错的,来支持了呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP