MediaRecorder与MediaPlayer的简单使用
来源:互联网 发布:iphone展示机软件 编辑:程序博客网 时间:2024/06/11 01:54
http://www.2cto.com/kf/201408/326131.html MediaRecorder类详解
遇到的坑:
- 如果想重复录音与播放,调用reset就可以了,不用释放资源(release)
- MediaPlayer如果没有调用reset时,如果重复播放,就会报错(Native Method))
- 与IOS交互过程的坑:使用AAC格式,IOS可以播放,但是ios录制的AAC格式默认进行了加密,我们这边无法做到即时播放,必须让IOS上传MP3格式我们才能体验好一些
- MediaPlayer播放网络音频效果也不错
public class RecordingActivity extends MVPBaseActivity<RecordingContract.View, RecordingPresenter> implements RecordingContract.View, View.OnTouchListener, MediaPlayer.OnCompletionListener { private static final String TAG = "RecordingActivity"; @BindView(R.id.toolbar_title) TextView mToolbarTitle; @BindView(R.id.tv_tool_right) TextView mTvToolRight; @BindView(R.id.toolbar) Toolbar mToolbar; @BindView(R.id.tv_time) TextView mTvTime; @BindView(R.id.iv_play) ImageView mIvPlay; @BindView(R.id.iv_recording) ImageView mIvRecording; private int mTime; private MediaRecorder mMediaRecorder; private String mFile; private MediaPlayer mMediaPlayer; public static void start(Activity activity) { activity.startActivity(new Intent(activity, RecordingActivity.class)); } @Override public int getLayoutId() { return R.layout.activity_recording; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); init(); } private void init() { initTitles(); initView(); } private void initView() { mIvPlay.setEnabled(false); mIvRecording.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mIvRecording.setImageResource(R.drawable.recording_stop); startRecording(); setTimer(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: mIvPlay.setEnabled(true); mIvPlay.setImageResource(R.drawable.recording_play_start); mIvRecording.setImageResource(R.drawable.recording_start); stopRecording(); stopTime(); break; } return true; } @OnClick(R.id.iv_play) public void onViewClicked() { playRecording(); mIvPlay.setEnabled(false); mIvPlay.setImageResource(R.drawable.recording_play_unenble); } private void stopRecording() { try { mMediaRecorder.stop(); mMediaRecorder.reset(); } catch (RuntimeException e) { mMediaRecorder.reset(); } } private void startRecording() { if (mMediaRecorder == null) { mMediaRecorder = new MediaRecorder(); } try { mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风 /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */ mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /* * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式 * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB) */ mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mMediaRecorder.setMaxDuration(30000); mFile = FileUtils.getPath() + "/" + HttpUtils.getTimeStamp() + ".3gp"; mMediaRecorder.setOutputFile(mFile); mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (IOException e) { Log.e(TAG, "e=" + e.getMessage()); } } private void playRecording() { try { if (mMediaPlayer == null) { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnCompletionListener(this); } mMediaPlayer.setDataSource(mFile); mMediaPlayer.prepare(); mMediaPlayer.start(); setTimer(); } catch (IOException e) { Log.e(TAG, "e=" + e.getMessage()); } } private void stopTime() { mTvTime.removeCallbacks(mRunnable); } private void setTimer() { mTvTime.setText("00"); mTime = 0; mTvTime.postDelayed(mRunnable, 1000); } private Runnable mRunnable = new Runnable() { @Override public void run() { mTvTime.setText(StringUtils.add(++mTime)); if (mTime == 30) { mIvRecording.setImageResource(R.drawable.recording_start); return; } mTvTime.postDelayed(this, 1000); } }; private void initTitles() { mToolbar.setNavigationIcon(R.drawable.back); mToolbarTitle.setText("语音录制"); mTvToolRight.setText("保存"); mTvToolRight.setTextColor(getResources().getColor(R.color.color_4990e2)); } @Override public void onCompletion(MediaPlayer mp) { Log.e(TAG, "onCompletion"); mp.stop(); mp.reset(); mIvPlay.setEnabled(true); mIvPlay.setImageResource(R.drawable.recording_play_start); mTvTime.removeCallbacks(mRunnable); } @Override protected void onDestroy() { mTvTime.removeCallbacks(mRunnable); if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } if (mMediaRecorder != null) { mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } super.onDestroy(); }}
阅读全文
0 0
- MediaRecorder与MediaPlayer的简单使用
- MediaRecorder和MediaPlayer的简单使用
- MediaRecorder与MediaPlayer步骤
- 简单的MediaPlayer使用
- MediaPlayer的简单使用
- 简单的使用MediaPlayer
- 使用MediaRecorder实现简单的录像功能
- Android开发 音频的录制(MediaRecorder)与播放(MediaPlayer)踩坑记录
- 使用MediaRecorder和MediaPlayer实现录音和播放功能-以及碰到的问题
- SoundPool与mediaPlayer的使用
- Android学习篇章46-录音MediaRecorder与播放MediaPlayer
- Android 录音(MediaRecorder)与播放(MediaPlayer)
- Android播放器MediaPlayer与MediaRecorder:录制音频并播放
- 【Android】MediaRecorder/MediaPlayer实现录音与播放录音
- 使用MediaRecorder录制音频,用MediaPlayer播放音频
- Android中MediaPlayer的简单使用
- MediaPlayer 播放 MP3文件的简单使用
- 使用MediaPlayer实现简单的录音
- Hessian使用记录
- 用gcviewer分析gc日志
- 三向字符串快速排序
- 如何添加开机启动项
- IEnumerable.Select和SelectMany的区别
- MediaRecorder与MediaPlayer的简单使用
- Android常用开源项目(四十一)
- ClassNotFoundException NoClassDefFoundError
- LintCode-直方图最大矩形覆盖
- 华为机试:图片处理、挑7
- 微信小程序(5)--页面跳转传值(点击item传值)
- bzoj2131: 免费的馅饼
- php获取客户端真实ip地址的三种方法
- 在串口通信开发中实现自动查找串口端口的方法