Android媒体的音量控制,录音,播音—— 学习笔记

1、音量控制 AudioManager:

获取方式

// 从系统服务中获取音频管理器
mAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

共有六种响铃类型:通话音,系统音,铃音,媒体音,闹钟音,通知音

{    AudioManager.STREAM_VOICE_CALL, AudioManager.STREAM_SYSTEM,
     AudioManager.STREAM_RING, AudioManager.STREAM_MUSIC,
     AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION};

两个调整音量的函数:

adjustStreamVolume()调整一级音量。

setStreamVolume()调整到某音量值

2、 录制音频部分,媒体录制器MediaRecorder

需要录音录像权限以及SD卡权限

初始化录制

// 初始化录制操作
private void initRecord() {
  mMediaRecorder = new MediaRecorder(); // 创建一个媒体录制器
  mMediaRecorder.setOnErrorListener(this); // 设置媒体录制器的错误监听器
  mMediaRecorder.setOnInfoListener(this); // 设置媒体录制器的信息监听器
  mMediaRecorder.setAudioSource(AudioSource.MIC); // 设置音频源为麦克风
  mMediaRecorder.setOutputFormat(OutputFormat.AMR_NB); // 设置媒体的输出格式
  mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB); // 设置媒体的音频编码器,必须在setOutputFormat之后调用,否则会报异常
  // mMediaRecorder.setAudioSamplingRate(8); // 设置媒体的音频采样率。可选
  // mMediaRecorder.setAudioChannels(2); // 设置媒体的音频声道数。可选
  // mMediaRecorder.setAudioEncodingBitRate(1024); // 设置音频每秒录制的字节数。可选
  mMediaRecorder.setMaxDuration(10 * 1000); // 设置媒体的最大录制时长
  // mMediaRecorder.setMaxFileSize(1024*1024*10); // 设置媒体的最大文件大小
  // setMaxFileSize与setMaxDuration设置其一即可
  mMediaRecorder.setOutputFile(mRecordFilePath); // 设置媒体文件的保存路径
  try {
    mMediaRecorder.prepare(); // 媒体录制器准备就绪
    mMediaRecorder.start(); // 媒体录制器开始录制
  } catch (Exception e) {
    e.printStackTrace();
  }
}

取消录制

    // 取消录制操作
    private void cancelRecord() {
        if (mMediaRecorder != null) {
            mMediaRecorder.setOnErrorListener(null); // 错误监听器置空
            mMediaRecorder.setPreviewDisplay(null); // 预览界面置空
            try {
                mMediaRecorder.stop(); // 媒体录制器停止录制
            } catch (Exception e) {
                e.printStackTrace();
            }
            mMediaRecorder.release(); // 媒体录制器释放资源
            mMediaRecorder = null;
        }
    }

定义错误监听器和信息监听器(信息监控器遇到录制状况:例如录制达到限制时长)

    // 在录制发生错误时触发
    public void onError(MediaRecorder mr, int what, int extra) {
        if (mr != null) {
            mr.reset(); // 重置媒体录制器
        }
    }

    // 在录制遇到状况时触发
    public void onInfo(MediaRecorder mr, int what, int extra) {
        // 录制达到最大时长,或者达到文件大小限制,都停止录制
        if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED
                || what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED) {
            ck_record.setChecked(false);
        }
    }

3.2、播放音频,媒体播放器MediaPlayer

1、根据路径或者rawid初始化媒体播放器。这里只是传入了路径,播放器的路径指定要调用setDataSourse或create

    // 根据SD卡的文件路径,初始化媒体播放器
    public void init(String path) {
        mAudioPath = path;
        ck_play.setEnabled(true);
        ck_play.setTextColor(Color.BLACK);
        // 创建一个媒体播放器
        mMediaPlayer = new MediaPlayer();
        // 设置媒体播放器的播放完成监听器
        mMediaPlayer.setOnCompletionListener(this);
        Log.d(TAG, "audio path = " + mAudioPath);
    }

    // 根据raw目录的资源编号,初始化媒体播放器
    public void initFromRaw(Context context, int raw_id) {
        mContext = context;
        mRawId = raw_id;
        ck_play.setEnabled(true);
        ck_play.setTextColor(Color.BLACK);
        // 创建一个媒体播放器
        mMediaPlayer = new MediaPlayer();
        // 设置媒体播放器的播放完成监听器
        mMediaPlayer.setOnCompletionListener(this);
    }

2、开始播放,这个函数也用来从头播放

// 从头开始播放
    private void play() {
        try {
            mMediaPlayer.reset(); // 重置媒体播放器
            // 设置音频流的类型为音乐
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            if (!TextUtils.isEmpty(mAudioPath)) {
                // 设置媒体数据的文件路径
                mMediaPlayer.setDataSource(mAudioPath);
                mMediaPlayer.prepare(); // 媒体播放器准备就绪
            } else {
                // 设置指定目录路径的音乐文件
                //mMediaPlayer = MediaPlayer.create(context, Uri.parse(path));
                // 设置指定资源编号的音乐文件
                mMediaPlayer = MediaPlayer.create(mContext, mRawId);
                // 通过create方法创建的播放器实例,无需再调用prepare方法,因为create内部已经调用过了
            }
            mMediaPlayer.start(); // 媒体播放器开始播放
            // 设置进度条的最大值,也就是媒体的播放时长
            pb_play.setMax(mMediaPlayer.getDuration());
            mTimer = new Timer(); // 创建一个计时器
            // 计时器每隔一秒就更新进度条上的播放进度
            mTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    pb_play.setProgress(mMediaPlayer.getCurrentPosition());
                }
            }, 0, 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
}

3、设置播放结束的监听器。

    // 一旦发现媒体播放完毕,就触发播放完成监听器的onCompletion方法
    public void onCompletion(MediaPlayer mp) {
        isFinished = true;
        pb_play.setProgress(0);
        ck_play.setChecked(false);
        if (mTimer != null) {
            mTimer.cancel(); // 取消计时器
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值