语音录制和播放

录制

网易云通信 SDK 提供了一套录制高清语音的接口 AudioRecorder ,用于采集,编码,存储高清语音数据,并提供过程回调,回调接口为 IAudioRecordCallback,供开发者进行自由的界面展现。

/**
 * 构造函数
 *
 * @param context     上下文
 * @param recordType  录制音频类型(aac/amr)
 * @param maxDuration 最长录音时长,到该长度后,会自动停止录音
 * @param cb          录音过程回调
 */
public AudioRecorder(Context context, RecordType recordType,
        int maxDuration, IAudioRecordCallback cb);
参数 说明
context 上下文
recordType 录制音频类型(aac/amr)
maxDuration 最长录音时长,到该长度后,会自动停止录音
cb 录音过程回调

AudioRecorder 接口说明:

返回值 AudioRecorder 接口 说明
void completeRecord(boolean cancel) 完成(结束)录音,根据参数 cancel,做不同的回调。
如果 cancel 为 true,回调 IAudioRecordCallback#onRecordCancel, 为 false,回调 IAudioRecordCallback#onRecordSuccess
void destroyAudioRecorder() 释放资源
int getCurrentRecordMaxAmplitude() 获取当前录音时最大振幅, 40ms 更新一次数据
void handleEndRecord(boolean isSuccess, int duration) 处理录制结束后的操作,回调 IAudioRecordCallback#onRecordSuccess
boolean isRecording() 是否正在录音
void startRecord() 启动(开始)录音,如果成功,会按照顺序回调 IAudioRecordCallback#onRecordReady 和 IAudioRecordCallback#onRecordStart

IAudioRecordCallback 接口说明:

IAudioRecordCallback 接口 说明
onRecordCancel() 录音结束, 用户主动取消录音
onRecordFail() 录音结束,出错
onRecordReachedMaxTime(int maxTime) 到达指定的最长录音时间
onRecordReady() 录音器已就绪,提供此接口用于在录音前关闭本地音视频播放(可选)
onRecordStart(File audioFile, RecordType recordType) 开始录音回调
onRecordSuccess(File audioFile, long audioLength, RecordType recordType) 录音结束,成功

Recorder 使用示例代码如下:


// 定义录音过程回调对象
IAudioRecordCallback callback = new IAudioRecordCallback () {

    void onRecordReady() {
        // 初始化完成回调,提供此接口用于在录音前关闭本地音视频播放(可选)
    }

    void onRecordStart(File audioFile, RecordType recordType) {
        // 开始录音回调
    }

    void onRecordSuccess(File audioFile, long audioLength, RecordType recordType) {
        // 录音结束,成功
    }

    void onRecordFail() {
        // 录音结束,出错
    }

    void onRecordCancel() {
        // 录音结束, 用户主动取消录音
    }

    void onRecordReachedMaxTime(int maxTime) {
        // 到达指定的最长录音时间
    }
};
// 初始化recorder
AudioRecorder recorder = new AudioRecorder(
    context,
    RecordType.AAC, // 录制音频类型(aac/amr)
    maxDuration, // 最长录音时长,到该长度后,会自动停止录音, 默认120s
    callback // 录音过程回调
    );
// 开始录音
if (!recorder.startRecord()) {
    // 开启录音失败。
}
// 结束录音, 正常结束,或者取消录音
recorder.completeRecord(cancel);

播放

网易云通信的语音消息格式有 aac 和 amr 两种格式可选,由于 2.x 系统的原生 MediaPlayer 不支持 aac 格式,因此 SDK 也提供了一个 AudioPlayer 来播放网易云通信的语音消息。同时,将 MediaPlayer 的接口进行了一些封装,使得在会话场景下播放语音更加方便。

/**
 * 音频播放器构造函数
 * @param context 上下文参数
 * @param audioFile 待播放音频的文件路径
 * @param listener 播放进度监听者
 */
public AudioPlayer(Context context, String audioFile, OnPlayListener listener);
参数 说明
context 上下文参数
audioFile 待播放音频的文件路径
listener 播放进度监听者

AudioPlayer 接口说明:

返回值 AudioPlayer 接口 说明
long getCurrentPosition() 获取当前音频播放进度
long getDuration() 获取音频持续时间长度
OnPlayListener getOnPlayListener() 获取 AudioPlayer 的播放进度监听
boolean isPlaying() 查询是否正在播放
void seekTo(int msec) 让播放器跳转到指定位置继续播放
void setDataSource(String audioFile) 设置音频来源
void setOnPlayListener(OnPlayListener listener) 设置播放监听
void start(int audioStreamType) 开始播放
void stop() 停止播放

OnPlayListener 接口说明:

OnPlayListener 接口 说明
onCompletion() 播放完成
onError(String error) 播放过程中出错。参数为出错原因描述
onInterrupt() 中断播放
onPlaying(long curPosition) 播放进度报告,每隔 500ms 会回调一次,告诉当前进度。 参数为当前进度,单位为毫秒,可用于更新 UI
onPrepared() 文件解码完成,准备播放
// 定义一个播放进程回调类
OnPlayListener listener = new OnPlayListener() {

    // 音频转码解码完成,会马上开始播放了
    public void onPrepared() {}

    // 播放结束
    public void onCompletion() {}

    // 播放被中断了
    public void onInterrupt() {}

    // 播放过程中出错。参数为出错原因描述
    public void onError(String error){}

    // 播放进度报告,每隔 500ms 会回调一次,告诉当前进度。 参数为当前进度,单位为毫秒,可用于更新 UI
    public void onPlaying(long curPosition) {}
};

// 构造播放器对象
AudioPlayer player = new AudioPlayer(context, filePath, listener);

// 开始播放。需要传入一个 Stream Type 参数,表示是用听筒播放还是扬声器。取值可参见
// android.media.AudioManager#STREAM_***
// AudioManager.STREAM_VOICE_CALL 表示使用听筒模式
// AudioManager.STREAM_MUSIC 表示使用扬声器模式
player.start(streamType);

// 如果中途切换播放设备,重新调用 start,传入指定的 streamType 即可。player 会自动停止播放,然后再以新的 streamType 重新开始播放。
// 如果需要从中断的地方继续播放,需要外面自己记住已经播放过的位置,然后在 onPrepared 回调中调用 seekTo
player.seekTo(pausedPosition);

// 主动停止播放
player.stop();