MediaRecorder与MediaPlayer的简单使用

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值