Android amr音频播放器 语音发送

本文详细介绍了如何在Android平台上实现AMR音频的播放功能,以及如何将录制的语音通过微信接口进行发送。内容包括AMR音频格式解析、音频播放组件的使用和微信语音接口的调用流程。
摘要由CSDN通过智能技术生成
public class AmrAudioPlayer {

    private String path;
    private MediaPlayer mMediaPlayer;
    private AudioManager mAudioManager;
    private IOnAudioPlayerLisenter mOnAudioPlayerLisenter;
    private static AmrAudioPlayer mInstance = null;
    private static final String TAG = AmrAudioPlayer.class.getSimpleName();

    private AmrAudioPlayer(){}

    public static AmrAudioPlayer getInstance() {
        mInstance = mInstance == null ? new AmrAudioPlayer() : mInstance;
        return mInstance;
    }

    public void play(String path){
        this.path = path;
        if (TextUtils.isEmpty(path)) {
            return;
        }
        mMediaPlayer = new MediaPlayer();
        try {
            mMediaPlayer.setDataSource(path);
        } catch (IOException e) {
            e.printStackTrace();
            Log.i(TAG,"播放失败.");
        }
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        // 通过异步的方式装载媒体资源
        mMediaPlayer.prepareAsync();
        //异步资源加载完毕后的事件处理
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                // 装载完毕 开始播放流媒体
                Log.i(TAG,"开始播放......");
                mp.start();
                if (mOnAudioPlayerLisenter != null) {
                    mOnAudioPlayerLisenter.onStart();
                }
            }
        });
        //播放完成后的处理
        mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                stop();
            }
        });
        //音频播放发生异常时的处理
        mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.i(TAG,"音频播放发生错误......");
                return false;
            }
        });
    }

    /***
     * 停止播放
     */
    public void stop(){
        Log.i(TAG,"停止播放......");
        if (null == mMediaPlayer) {
            return;
        }
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
        }
        mMediaPlayer.release();
        mMediaPlayer = null;
        if (null != mOnAudioPlayerLisenter) {
            mOnAudioPlayerLisenter.onStop();
        }
    }

    public boolean isPlaying(){
        return mMediaPlayer != null && mMediaPlayer.isPlaying();
    }

    public String getAudioPath(){
        return path;
    }

    public void setIOnAudioPlayerLisenter(IOnAudioPlayerLisenter onAudioPlayerLisenter) {
        mOnAudioPlayerLisenter = onAudioPlayerLisenter;
    }

    /***
     *音频播放回调接口
     */
    public interface IOnAudioPlayerLisenter{

        public void onStart();

        /***
         * 音频播放停止
         */
        public void onStop();
    }
}

 Amr工具类
public class AmrRecordUtil {

    private Context mContext;
    /**
     * 生成的文件名称
     */
    String filename = System.currentTimeMillis()+"";

    /**
     * 输出文件格式
     */
    private static final String AUDIO_RECORDER_FILE_EXT_AMR = ".amr";
    /**
     * 保存到的文件夹路径
     * 弃用,统一使用 FileConstants.getAudioMsgDirPath(context)
     */
//    private static final String AUDIO_RECORDER_FOLDER = "Android/data/com.pingan.diablouser/files/audios";

    /**
     * 生成的临时RAW文件名称
     */
    private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.pcm";
    /**
     * 采样率
     */
    private static final int RECORDER_SAMPLERATE = 8000;
    /**
     * 声道
     */
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
    /**
     * 比特率
     */
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

    /**
     * 录音Record
     */
    private AudioRecord recorder = null;
    /**
     * 缓存区
     */
    private int minBufferSize = 0;
    /**
     * 录音线程
     */
    private Thread recordingThread = null;
    /**
     * 录音状态
     */
    private boolean isRecording = false;
    /**
     * handler,用于向主线程传递消息,更新UI
     */
    private Handler mHandler;

    /**
     * started recording
     */
    public static final int MSG_REC_STARTED = 0;

    /**
     * stopped recording
     */
    public static final int MSG_REC_STOPPED = 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值