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();    }}