精华内容
下载资源
问答
  • android实现录音文件合并
  • 本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下: Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord,各有优劣。 1、MediaRecorder 已经集成了录音、编码、压缩等...
  • 本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下:Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord,各有优劣。1、MediaRecorder已经集成了录音、编码、压缩等,支持...

    本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下:

    Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord,各有优劣。

    1、MediaRecorder

    已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp

    优点:大部分已经集成,直接调用相关接口即可,代码量小

    缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件

    2、AudioRecord

    主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音)

    优点:语音的实时处理,可以用代码实现各种音频的封装

    缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩

    先说 MediaRecorder : MediaRecorder因为大部分功能已经集成,所以使用起来相对比较简单。

    下面是个小demo:

    ① 界面

    界面比较简单,由于MediaRecorder 并不能实现暂停、继续录音的功能

    android:id="@+id/activity_main"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical">

    android:id="@+id/btn_start"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:text="开始" />

    android:id="@+id/btn_stop"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:enabled="false"

    android:text="停止" />

    android:id="@+id/text_time"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:gravity="center"

    android:text="00:00:00"

    android:padding="5dp"

    android:layout_marginTop="10dp"/>

    ② 相关录音功能

    开始录音

    public void startRecord() {

    // 开始录音

    /* ①Initial:实例化MediaRecorder对象 */

    if (mMediaRecorder == null)

    mMediaRecorder = new MediaRecorder();

    try {

    /* ②setAudioSource/setVedioSource */

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风

    /*

    * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式

    * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)

    */

    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */

    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

    fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";

    if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {

    FileUtils.makeFolders(audioSaveDir);

    }

    filePath = audioSaveDir + fileName;

    /* ③准备 */

    mMediaRecorder.setOutputFile(filePath);

    mMediaRecorder.prepare();

    /* ④开始 */

    mMediaRecorder.start();

    } catch (IllegalStateException e) {

    LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());

    } catch (IOException e) {

    LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());

    }

    }

    音频编码可以根据自己实际需要自己设定,文件名防止重复,使用了日期_时分秒的结构,audioSaveDir 是文件存储目录,可自行设定。

    停止录音

    public void stopRecord() {

    try {

    mMediaRecorder.stop();

    mMediaRecorder.release();

    mMediaRecorder = null;

    filePath = "";

    } catch (RuntimeException e) {

    LogUtil.e(e.toString());

    mMediaRecorder.reset();

    mMediaRecorder.release();

    mMediaRecorder = null;

    File file = new File(filePath);

    if (file.exists())

    file.delete();

    filePath = "";

    }

    }

    时长记录

    // 记录录音时长

    private void countTime() {

    while (isRecording) {

    LogUtil.d("正在录音");

    timeCount++;

    Message msg = Message.obtain();

    msg.what = TIME_COUNT;

    msg.obj = timeCount;

    myHandler.sendMessage(msg);

    try {

    timeThread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    LogUtil.d("结束录音");

    timeCount = 0;

    Message msg = Message.obtain();

    msg.what = TIME_COUNT;

    msg.obj = timeCount;

    myHandler.sendMessage(msg);

    }

    将录音时长格式化

    // 格式化 录音时长为 时:分:秒

    public static String FormatMiss(int miss) {

    String hh = miss / 3600 > 9 ? miss / 3600 + "" : "0" + miss / 3600;

    String mm = (miss % 3600) / 60 > 9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;

    String ss = (miss % 3600) % 60 > 9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;

    return hh + ":" + mm + ":" + ss;

    }

    Activity全部代码

    import android.media.MediaRecorder;

    import android.os.Bundle;

    import android.os.Environment;

    import android.os.Handler;

    import android.os.Message;

    import android.support.v7.app.AppCompatActivity;

    import android.text.format.DateFormat;

    import android.view.View;

    import android.widget.Button;

    import android.widget.TextView;

    import com.zzx.hellokotlin.R;

    import com.zzx.hellokotlin.utils.FileUtils;

    import com.zzx.hellokotlin.utils.LogUtil;

    import java.io.File;

    import java.io.IOException;

    import java.util.Calendar;

    import java.util.Locale;

    public class Record2Activity extends AppCompatActivity {

    // 录音界面相关

    Button btnStart;

    Button btnStop;

    TextView textTime;

    // 录音功能相关

    MediaRecorder mMediaRecorder; // MediaRecorder 实例

    boolean isRecording; // 录音状态

    String fileName; // 录音文件的名称

    String filePath; // 录音文件存储路径

    Thread timeThread; // 记录录音时长的线程

    int timeCount; // 录音时长 计数

    final int TIME_COUNT = 0x101;

    // 录音文件存放目录

    final String audioSaveDir = Environment.getExternalStorageDirectory().getAbsolutePath()+"/audiodemo/";

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_record2);

    btnStart = (Button) findViewById(R.id.btn_start);

    btnStop = (Button) findViewById(R.id.btn_stop);

    textTime = (TextView) findViewById(R.id.text_time);

    btnStart.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    // 开始录音

    btnStart.setEnabled(false);

    btnStop.setEnabled(true);

    startRecord();

    isRecording = true;

    // 初始化录音时长记录

    timeThread = new Thread(new Runnable() {

    @Override

    public void run() {

    countTime();

    }

    });

    timeThread.start();

    }

    });

    btnStop.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    // 停止录音

    btnStart.setEnabled(true);

    btnStop.setEnabled(false);

    stopRecord();

    isRecording = false;

    }

    });

    }

    // 记录录音时长

    private void countTime() {

    while (isRecording) {

    LogUtil.d("正在录音");

    timeCount++;

    Message msg = Message.obtain();

    msg.what = TIME_COUNT;

    msg.obj = timeCount;

    myHandler.sendMessage(msg);

    try {

    timeThread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    LogUtil.d("结束录音");

    timeCount = 0;

    Message msg = Message.obtain();

    msg.what = TIME_COUNT;

    msg.obj = timeCount;

    myHandler.sendMessage(msg);

    }

    /**

    * 开始录音 使用amr格式

    * 录音文件

    * @return

    */

    public void startRecord() {

    // 开始录音

    /* ①Initial:实例化MediaRecorder对象 */

    if (mMediaRecorder == null)

    mMediaRecorder = new MediaRecorder();

    try {

    /* ②setAudioSource/setVedioSource */

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风

    /*

    * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式

    * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)

    */

    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */

    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

    fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";

    if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {

    FileUtils.makeFolders(audioSaveDir);

    }

    filePath = audioSaveDir + fileName;

    /* ③准备 */

    mMediaRecorder.setOutputFile(filePath);

    mMediaRecorder.prepare();

    /* ④开始 */

    mMediaRecorder.start();

    } catch (IllegalStateException e) {

    LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());

    } catch (IOException e) {

    LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());

    }

    }

    /**

    * 停止录音

    */

    public void stopRecord() {

    //有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈!

    try {

    mMediaRecorder.stop();

    mMediaRecorder.release();

    mMediaRecorder = null;

    filePath = "";

    } catch (RuntimeException e) {

    LogUtil.e(e.toString());

    mMediaRecorder.reset();

    mMediaRecorder.release();

    mMediaRecorder = null;

    File file = new File(filePath);

    if (file.exists())

    file.delete();

    filePath = "";

    }

    }

    // 格式化 录音时长为 时:分:秒

    public static String FormatMiss(int miss) {

    String hh = miss / 3600 > 9 ? miss / 3600 + "" : "0" + miss / 3600;

    String mm = (miss % 3600) / 60 > 9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;

    String ss = (miss % 3600) % 60 > 9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;

    return hh + ":" + mm + ":" + ss;

    }

    Handler myHandler = new Handler() {

    @Override

    public void handleMessage(Message msg) {

    switch (msg.what) {

    case TIME_COUNT:

    int count = (int) msg.obj;

    LogUtil.d("count == " + count);

    textTime.setText(FormatMiss(count));

    break;

    }

    }

    };

    }

    总结:MediaRecorder 实现录音还是比较简单的,只是不能暂停。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • Android实现录音功能汇总

    千次阅读 2019-06-10 16:40:01
    Android实现录音功能汇总一、目标二、录音效果比较三、MediaRecorder四、参考文章五、开源项目六、同时使用MediaRecorder和AudioRecord七、调用第三方应用录音八、调研过程回顾九、Finally 神马笔记新的版本准备加入...

    神马笔记新的版本准备加入录音功能。

    一、目标

    神马笔记加入录音功能做技术储备。

    二、录音效果比较

    比较了MediaRecorder和AudioRecord的录音效果,尝试了音乐和人声。

    最终的结论是二者差别不大,没有太明显的区别。

    毕竟底层的实现是一样的,只是对PCM数据的处理有些许差别。

    • 音源
    参数名 参数值
    歌曲 身骑白马-黄小琥
    输出设备 坚果 Pro2
    输入设备 荣耀畅玩7
    录音方式 两部手机并排录音
    • 参数
    参数名 参数值
    OutputFormat MediaRecorder.OutputFormat.MPEG_4
    AudioEncoder MediaRecorder.AudioEncoder.AAC
    AudioChannels 1
    AudioSamplingRate 44100
    AudioEncodingBitRate 128000
    • 比较结果
    录音方式 开源项目 结果
    MediaRecorder dkim0419 / SoundRecorder 平分秋色
    AudioRecord google / ringdroid 不相伯仲

    三、MediaRecorder

    MediaRecorder 相关参数和方法一览。

    • AudioSource
    常量 描述
    AUDIO_SOURCE_INVALID
    DEFAULT
    MIC 麦克风
    VOICE_UPLINK
    VOICE_DOWNLINK
    VOICE_CALL
    CAMCORDER
    VOICE_RECOGNITION
    VOICE_COMMUNICATION
    REMOTE_SUBMIX
    UNPROCESSED
    RADIO_TUNER
    HOTWORD
    • OutputFormat
    常量 描述
    DEFAULT
    THREE_GPP
    MPEG_4
    RAW_AMR
    AMR_NB
    AMR_WB
    AAC_ADIF
    AAC_ADTS
    OUTPUT_FORMAT_RTP_AVP
    MPEG_2_TS
    WEBM
    • AudioEncoder
    常量 描述
    DEFAULT
    AMR_NB
    AMR_WB
    AAC
    HE_AAC
    AAC_ELD
    VORBIS
    • 其他参数设置
    方法 描述
    setAudioChannels(int numChannels)
    setAudioEncodingBitRate(int bitRate)
    setAudioSamplingRate(int samplingRate) 建议:16000
    setOutputFile(String path)
    setOutputFile(File file)
    setOutputFile(FileDescriptor fd)
    setOnErrorListener(OnErrorListener l)
    setOnInfoListener(OnInfoListener listener)

    四、参考文章

    文章 描述
    Android录制音频的三种方式 1. 第三方应用
    2. MediaRecorder
    3. AudioRecord
    Android 录音MediaRecorder到AudioRecord 比较了2种录音的实现方式,并提供了WAV转AAC的实现方式。
    体积这么小而且这么方便,很大的一个缺点,也是我放弃的理由,就是录下的音质不太好,总感觉被什么笼罩着在。
    Android实时获取音量(单位:分贝) 介绍了录音时2种方式获取实时音量
    MediaRecorder和AudioRecord录音与MediaPlayer和AudioTrack播放区别 MediaRecorder与AudioRecord在底层代码是一致的,只是MediaRecorder提供了更高层的封装。
    MediaRecorder和AudioRecord的区别和联系
    音频采样位数,采样率,比特率

    五、开源项目

    开源项目 实现方式 描述
    google / ringdroid AudioRecord Ringdroid is an Android application for recording and editing sounds, and creating ringtones, directly on the handset.

    Supported file formats right now include:

    MP3
    AAC/MP4 (including unprotected iTunes music)
    WAV
    3GPP/AMR (this is the format used when you record sounds directly on the handset)
    OGG
    mkjihu / AudioWaveViewEdit AudioRecord 讀取手機上有的音檔
    滑動自訂 裁剪音檔區間
    可錄音暫停後繼續錄音
    錄音同時繪製波型圖

    使用google / ringdroid核心代码,并增强之
    Arjun-sna / Android-AudioRecorder-App AudioRecord 完整的录音应用。
    cokuscz / audioWaveCanvas AudioRecord 录音并实时绘制波形图。
    dkim0419 / SoundRecorder MediaRecorder
    renhui / AudioDemo MediaRecorder 演示了使用AudioRecord录音,并保存为wav文件。
    developerHaoz / SoundRecorderUtils MediaRecorder 封装成Service
    lassana / continuous-audiorecorder MediaRecorder 支持暂停
    gelitenight / WaveView 绘制波浪动画
    Jay-Goo / WaveLineView 波浪线动画
    google / ExoPlayer 播放器,不包含录音

    六、同时使用MediaRecorder和AudioRecord

    相同的代码在不同设备表现不一致。

    结果不可控,不要同时使用。

    • MediaRecorder first
    设备 版本 结果
    荣耀畅玩7 8.1 Media分贝值:15.563025007672874
    Audio分贝值:-Infinity
    Media分贝值:26.848453616444125
    Audio分贝值:-Infinity
    Media分贝值:33.25515663363148
    Audio分贝值:-Infinity
    ……
    红米6 Pro 9.0 Media分贝值:27.60422483423212
    Audio分贝值:28.706397912918934
    Media分贝值:37.14664992862537
    Audio分贝值:30.6302592206421
    Media分贝值:38.276277047674334
    Audio分贝值:28.778489726586123
    ……
    • AudioRecord first
    设备 版本 结果
    荣耀畅玩7 8.1 E/MediaRecorder: start failed: -38
    java.lang.IllegalStateException
    红米6 Pro 9.0 Audio分贝值:31.155938717202027
    Media分贝值:33.06425027550687
    Audio分贝值:32.32133729412097
    Media分贝值:38.276277047674334
    Audio分贝值:32.98663099227764
    Media分贝值:40.506117305295405
    ……

    七、调用第三方应用录音

    • 启动第三方应用
    Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
    
    try {
      startActivityForResult(intent, REQUEST_RECORDER);
    } catch (Exception e) {
    
    }
    
    • 处理结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
    
      if (resultCode == RESULT_OK && REQUEST_RECORDER == requestCode){
        uri = data.getData();
      }
    
    
    }
    
    设备 结果 截图
    Android模拟器 ActivityNotFoundException 在这里插入图片描述
    荣耀畅玩7 content://media/external/audio/media/2979 在这里插入图片描述
    红米6 Pro content://media/external/file/125654 在这里插入图片描述

    八、调研过程回顾

    • Android实现录音的3种方式
    1. 使用Intent调用第三方应用
    2. MediaRecorder
    3. AudioRecord

    考虑到可能不存在第三方录音应用,以及录音应用的多样性。为保存用户体验的一致性,排除第三方应用的方式。

    • MediaRecorder和AudioRecord比较
    MediaRecorder AudioRecord
    录音效果 平分秋色 不相伯仲
    音源数据 没有,转码后直接保存到文件。 PCM数据,需要自己转码。
    可以使用MediaCodec进行编码解码,详情参考google / ringdroid
    音频编码 设置即可 需要自己实现
    缓存 无需关心 需要自己处理,或者直接将PCM数据写入文件
    • 结论

    鉴于二者的录音效果并没有明显区别。

    考虑神马笔记的使用场景,并不会对过程中的音频数据进行处理,而只关心最终的录音结果。

    因此,MediaRecorder已经足够使用。

    未来如果需要处理音频数据,可以使用MediaCodec进行编码解码,或者使用Native方式。

    九、Finally

    以实无有法。得阿耨多罗三藐三菩提。
    是故然灯佛与我授记。作是言。
    汝于来世。当得作佛。号释迦牟尼。

    展开全文
  • android 实现录音功能的完整工程实例
  • Android 实现录音、播放声音和删除声音功能
  • Android 实现录音功能

    万次阅读 2018-12-28 11:14:06
    Android音频管理之AudioManager(原创):...Android 录音实现(AudioRecord):https://www.jianshu.com/p/90c4071c7768 Android 录音实现(MediaRecorder):https://www.jianshu.com/p/de779d509e6c ...

    一、简述

    项目中需要实现聊天录音的功能,搜集资料实现初步功能之后,在这里统一整理一下。

    Android提供了两个对象用于录音的实现:MediaRecorder 和AudioRecord。

    1、MediaRecorder:录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。MediaRecorder已经集成了录音、编码、压缩等,并支持少量的录音音频格式,但是这也是他的缺点,支持的格式过少并且无法实时处理音频数据。

    2、AudioRecord:主要实现对音频实时处理以及边录边播功能,相对MediaRecorder比较专业,输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩。

    MediaRecorder

    MediaRecorder因为已经集成了录音、编码、压缩等功能,所以使用起来相对比较简单,项目里面就是使用这个类来实现语音的录制功能的。

    具体关于MediaRecorder、AudioRecord的介绍,可以参考这里:

    Android 录音实现(MediaRecorder)

    Android 录音实现(AudioRecord)

    二、效果

    以下是Demo效果:

    在这里插入图片描述

    三、权限

    <!-- 录音 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--播音-->
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    四、使用

    1、常规设置

    1)设置最大时长:

    //默认时长60秒
    AudioRecordManager.getInstance(this).setMaxVoiceDuration(120);
    

    2)设置语音位置:

    //该库内不对文件夹是否存在进行判断,所以请在你的项目中自行判断
    mAudioDir = new File(Environment.getExternalStorageDirectory(), "LQR_AUDIO");
    if (!mAudioDir.exists()) {
        mAudioDir.mkdirs();
    }
    
    AudioRecordManager.getInstance(this).setAudioSavePath(mAudioDir.getAbsolutePath());
    

    2、录音

    录音使用的是 AudioRecordManager 类。

    1)基本方法:

    //开始录音
    AudioRecordManager.getInstance(MainActivity.this).startRecord();
    
    //将要取消录音(参与微信手指上滑)
    AudioRecordManager.getInstance(MainActivity.this).willCancelRecord();
    
    //继续录音(参与微信手指上滑后加下滑回到原位)
    AudioRecordManager.getInstance(MainActivity.this).continueRecord();
    
    //停止录音
    AudioRecordManager.getInstance(MainActivity.this).stopRecord();
    
    //销毁录音
    AudioRecordManager.getInstance(MainActivity.this).destroyRecord();
    

    2)录音监听:

    该库提供IAudioRecordListener接口,方便用户对录音中不同事件进行处理,具体使用请参考DEMO代码(代码较多,请根据自己的项目修改),接口描述:

    public interface IAudioRecordListener {
    
        /**
         * 初始化提示视图
         */
        void initTipView();
    
        /**
         * 设置倒计时提示视图
         *
         * @param counter 10秒倒计时
         */
        void setTimeoutTipView(int counter);
    
        /**
         * 设置正在录制提示视图
         */
        void setRecordingTipView();
    
        /**
         * 设置语音长度太短提示视图
         */
        void setAudioShortTipView();
    
        /**
         * 设置取消提示视图
         */
        void setCancelTipView();
    
        /**
         * 销毁提示视图
         */
        void destroyTipView();
    
        /**
         * 开始录制
         * 如果是做IM的话,这里可以发送一个消息,如:对方正在讲话
         */
        void onStartRecord();
    
        /**
         * 录制结束
         *
         * @param audioPath 语音文件路径
         * @param duration  语音文件时长
         */
        void onFinish(Uri audioPath, int duration);
    
        /**
         * 分贝改变
         *
         * @param db 分贝
         */
        void onAudioDBChanged(int db);
    
    }
    

    2、播音

    播音使用的是 AudioPlayManager 类。

    1)开始播放:

    AudioPlayManager.getInstance().startPlay(MainActivity.this, audioUri, new IAudioPlayListener() {
        @Override
        public void onStart(Uri var1) {
            //开播(一般是开始语音消息动画)
        }
    
        @Override
        public void onStop(Uri var1) {
            //停播(一般是停止语音消息动画)
        }
    
        @Override
        public void onComplete(Uri var1) {
            //播完(一般是停止语音消息动画)
        }
    });
    

    2)结束播放:

    AudioPlayManager.getInstance().stopPlay();
    

    项目地址

    展开全文
  • 大家平时在使用微信qq聊天时经常会发送语音功能,今天小编给大家带来了基于android实现录音的方法仿微信语音、麦克风录音、发送语音、解决5.0以上BUG,需要的朋友参考下吧
  • 实现Android录音功能,并播放录音资源,资源为全部完整代码
  • android 实现录音功能

    2021-01-06 17:58:10
    提示:功能使用MediaRecorder+MediaPlayer实现 文章目录录音功能+录音播放功能前言一、MediaRecorder和MediaPlayer二、使用步骤1.AudioRecord 工具类2.在activity中使用总结 前言 提示:这里可以添加本文要记录的...

    录音功能+录音播放功能

    提示:功能使用MediaRecorder+MediaPlayer实现



    提示:以下是本篇文章正文内容

    一、MediaRecorder和MediaPlayer

    1、MediaRecorder 能够从设备麦克风捕获音频、保存音频并(使用 MediaPlayer)进行播放的应用。一些基础知识就不说了,想要了解的去谷歌官方文档自己看——传送门MediaRecorder 概览

    2、MediaPlayer播放存储在应用资源(原始资源)内的媒体文件、文件系统中的独立文件或者通过网络连接获得的数据流中的音频或视频。一些基础知识就不说了,想要了解的去谷歌官方文档自己看——传送门MediaPlayer 概览

    二、使用步骤

    1.AudioRecord 工具类

    代码如下(示例):(如有需要自己可再进行优化和封装)

    package com.example.homeword_common.utils;
    
    import android.content.Context;
    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.media.MediaRecorder;
    import android.os.Environment;
    import android.text.format.DateFormat;
    
    import com.example.homeword_common.core.base.BaseApplication;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Calendar;
    import java.util.Locale;
    
    /**
     * @author : Code23
     * @time : 2020/12/1
     * @module : AudioRecord
     * @describe :录音
     */
    public class AudioRecord {
        private String filepath = null;//文件路径
        private String filename = null;//文件名
        private MediaPlayer mediaPlayer = null;//播放
        private MediaRecorder mediaRecorder = null;//录音
    
        public MediaPlayer getMediaPlayer() {
            return mediaPlayer;
        }
    
        public AudioRecord() {
            createFileName(false);
    
            AudioManager audioManager = (AudioManager) BaseApplication.getContext().getSystemService(Context.AUDIO_SERVICE);
            audioManager.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
        }
    
        /**
         * 音频焦点监听
         */
        private AudioManager.OnAudioFocusChangeListener onAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
            @Override
            public void onAudioFocusChange(int focusChange) {
                switch (focusChange) {
                    case AudioManager.AUDIOFOCUS_LOSS://失去焦点
                        if (mediaPlayer != null) {
                            if (mediaPlayer.isPlaying()) {
                                onRecorderListener.onStopPlayer();
                            }
                        }
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                        break;
                    case AudioManager.AUDIOFOCUS_GAIN:
                        break;
                }
            }
        };
    
        /**
         * @param isplayer true 播放;false 暂停
         */
        public void OnPlayer(boolean isplayer) {
            if (isplayer) {
                onStartPlayer();
            } else {
                onStopPlayer();
            }
        }
    
        /**
         * @param isrecorder true 录音 ;false 结束
         */
        public void OnRecorder(boolean isrecorder) {
            if (isrecorder) {
                onStartRecorder();
            } else {
                onStopRecorder();
            }
        }
    
        /**
         * 播放录音
         */
        private void onStartPlayer() {
            mediaPlayer = new MediaPlayer();
            try {
                onRecorderListener.onStartPlayer();
                mediaPlayer.setDataSource(filepath + "/" + filename);
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mediaPlayer.prepare();
                mediaPlayer.start();
    
                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mediaPlayer) {
                        onRecorderListener.onFinishPlayer();
                    }
                });
            } catch (IOException e) {
                onRecorderListener.onFailurePlayer();
                onStopPlayer();
            }
        }
    
        /**
         * 暂停播放
         */
        private void onStopPlayer() {
            if (mediaPlayer != null) {
                onRecorderListener.onStopPlayer();
                mediaPlayer.stop();
                mediaPlayer.reset();
                mediaPlayer.release();
                mediaPlayer = null;
            }
        }
    
        /**
         * 开始录音
         */
        private void onStartRecorder() {
            mediaRecorder = new MediaRecorder();
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 声源(MIC表示来自于麦克风)
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出文件格式
            mediaRecorder.setOutputFile(filepath + "/" + filename);//设置输出文件名
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//设置音频编码器
            try {
                mediaRecorder.prepare();//完成初始化
            } catch (IOException e) {
                e.printStackTrace();
                //准备失败
                onRecorderListener.onFailureRecorder();
                return;
            }
            mediaRecorder.start();//启动
            onRecorderListener.onStartRecorder();
        }
    
        /**
         * 结束录音
         */
        private void onStopRecorder() {
            if (mediaRecorder != null) {
                try {
                    mediaRecorder.stop();
                    mediaRecorder.release();
                    mediaRecorder = null;
                } catch (RuntimeException e) {
                    mediaRecorder.reset();
                    mediaRecorder.release();
                    mediaRecorder = null;
                }
                File file = new File(filepath + filename);
                onRecorderListener.onStopRecorder(file);
            }
        }
    
        /**
         * 取消录音
         */
        public void onCancelRecorder() {
            if (mediaRecorder != null) {
                mediaRecorder.reset();
                mediaRecorder.release();
                mediaRecorder = null;
    
                File file = new File(filepath + filename);
                if (file.exists())
                    file.delete();
    
                onRecorderListener.onCanceRecorderl();
            }
        }
    
        /**
         * 删除录音文件
         */
        public void onDeleteRecorder() {
            File file = new File(filepath + filename);
            if (file.exists()) {
                file.delete();
            }
        }
    
        /**
         * 创建文件夹及文件名
         */
        public void createFileName(boolean isClear) {
            if (isClear) {
                filename = "";
            }
            filename = String.valueOf(DateFormat.format("yyyyMMddHHmm", Calendar.getInstance(Locale.CHINA))) + randomnum() + ".m4a";
            filepath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Homeword/InputAudio/";
            File file = new File(filepath);
            if (!file.exists()) { //文件夹不存在
                // 创建文件夹
                file.mkdirs();
            }
        }
    
        /**
         * 随机生成六位数
         *
         * @return
         */
        private int randomnum() {
            int num = (int) ((Math.random() * 9 + 1) * 100000);
            return num;
        }
    
        public void setOnRecorderListener(OnRecorderListener onRecorderListener) {
            this.onRecorderListener = onRecorderListener;
        }
    
        private OnRecorderListener onRecorderListener;
    
        public interface OnRecorderListener {
            //开始播放
            void onStartPlayer();
    
            //播放完成
            void onFinishPlayer();
    
            //播放暂停
            void onStopPlayer();
    
            //播放失败
            void onFailurePlayer();
    
            //开始录音
            void onStartRecorder();
    
            //取消录音
            void onCanceRecorderl();
    
            //暂停录音
            void onStopRecorder(File file);
    
            //录音失败
            void onFailureRecorder();
        }
    }
    
    

    2.在activity中使用

    代码如下(示例):

    package com.example.homeword_today.activity;
    
    import android.os.Bundle;
    import android.os.CountDownTimer;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.LinearLayout;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    
    import com.example.homeword_common.utils.AudioRecord;
    import com.example.homeword_today.R;
    
    import java.io.File;
    
    /**
     * @author : Code23
     * @time : 2021/1/6
     * @module : AudioRecordActivity
     * @describe :录音界面
     */
    public class AudioRecordActivity extends AppCompatActivity {
        private LinearLayout record;//录音按钮
        private LinearLayout play;//播放按钮
    
        public AudioRecord audioRecord;//录音工具类
        private int count = 0;//录音时长
        private boolean isplay = false;//判断是否播放
        private boolean isrecord = false;//判断是否正在录音
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_input);
            initView();
        }
    
        private void initView() {
            record = (LinearLayout) findViewById(R.id.record);
            play = (LinearLayout) findViewById(R.id.play);
    
            initData();
    
            //开始录音
            record.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    switch (motionEvent.getAction()) {
                        case MotionEvent.ACTION_DOWN://按下
                            audioRecord.OnRecorder(true);
                            break;
                        case MotionEvent.ACTION_UP://离开or取消
                        case MotionEvent.ACTION_CANCEL:
                            audioRecord.OnRecorder(false);
                            break;
                    }
                    return true;
                }
            });
    
            //录音结束播放录音
            play.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (audioRecord != null) {
                        if (isplay) {
                            audioRecord.OnPlayer(false);
                        } else {
                            audioRecord.OnPlayer(true);
                        }
                    }
                }
            });
        }
    
        /**
         * 录音和播放监听
         */
        private void initData() {
            //实例化
            audioRecord = new AudioRecord();
            audioRecord.setOnRecorderListener(new AudioRecord.OnRecorderListener() {
                @Override
                public void onStartPlayer() {//播放开始监听
                    isplay = true;
                }
    
                @Override
                public void onFinishPlayer() {//播放完成监听
                    isplay = false;
                }
    
                @Override
                public void onStopPlayer() {//播放暂停监听
                    isplay = false;
                }
    
                @Override
                public void onFailurePlayer() {//播放失败监听
                    isplay = false;
                }
    
                @Override
                public void onStartRecorder() {//录音开始监听
                    countDownTimer.start();
                    isrecord = true;
                }
    
                @Override
                public void onCanceRecorderl() {//录音取消监听
                    if (audioRecord != null) {
                        audioRecord.createFileName(false);
                    }
                    isrecord = false;
                }
    
                @Override
                public void onStopRecorder(File file) {//录音结束监听
                    countDownTimer.onFinish();
                    countDownTimer.cancel();
                    isrecord = false;
                }
    
                @Override
                public void onFailureRecorder() {//录音失败监听
                    if (audioRecord != null) {
                        audioRecord.onCancelRecorder();
                    }
                    isrecord = false;
                }
            });
        }
    
        /**
         * 录音时间,最多30秒
         */
        private CountDownTimer countDownTimer = new CountDownTimer(30000, 1000) {
            @Override
            public void onTick(long l) {
                count++;
            }
    
            @Override
            public void onFinish() {
                Log.e("123", "count:" + count);
            }
        };
    }
    
    

    总结

    总结:以上就是今天要讲的内容,本文仅仅简单介绍了MediaRecorder和MediaPlayer的使用,如有需要自己可再进行优化和封装。

    展开全文
  • android实现录音播放的项目源码

    热门讨论 2013-04-26 16:04:51
    Android录音,通过使用MediaRecoder录音,并保存到本地sd卡,格式为MP3,实现微信长按效果,并实现播放和停止
  • Android实现录音,拍照,人脸识别,调用谷歌人脸识别,代码很好很清楚
  • android 实现录音代码

    千次阅读 2014-10-24 20:59:18
    package com.coolsoft.app.oklight; import java.io.File; import java.io.IOException; import android.media.MediaRecorder; import android.os.Handler; import android.util.Log; import androi
  • Android实现录音的功能

    2016-11-02 21:57:37
    实现录音的功能 //[1]获取MediaRecorder类的实例 recorder = new MediaRecorder(); /[2]设置音频的来源 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //[3]设置音频的输出格式 r
  • Android 实现录音与播放

    千次阅读 2014-10-28 14:51:30
    android开发文档中有一个关于录音的类MediaRecord,一张图介绍了基本的流程: 给出了一个常用的例子: [java] view plaincopy MediaRecorder recorder = new MediaRecorder(); ...
  • Android 实现录音和监听声音大小实现话筒动画效果

    万次阅读 热门讨论 2015-10-21 09:34:25
    公司项目做的差不多了,,闲下来了,,就写一篇关于android利用MediaRecorder实现录音的文章吧,并且录音的时候声音的大小可以控制话筒实现动画效果, 效果如图所示: 录音的文件最后保存在SD卡下名为”luyin.3gp...
  • Android实现录音功能及播放语音功能

    千次阅读 2016-08-27 16:01:08
    Android实现录音功能其实很简单,直接调用的系统的就ok了,这里就不写实现的原理了,直接部署代码:所谓的实现就是用的MediaRecorder。 录音功能代码:  //开始录制  private void startRecord(){  if(mr =...
  • Android实现简单的录音、播音与视频录制功能。当然了、无论是出场绑定的还是第三方都有很多很好的应用。但是对于一名开发人员来说及时做的UI再丑、功能再烂那也是一种成就! 实现录音、录制视频功...
  • 先给大家展示下效果图,如果大家感觉不错,请参考使用方法,效果图如下所示:使用方法:录音工具类:AudioRecoderUtils.java,代码如下:public class AudioRecoderUtils {//文件路径private String filePath;...
  • Android实现简单的录音、播音与视频录制功能。当然了、无论是出场绑定的还是第三方都有很多很好的应用。但是对于一名开发人员来说及时做的UI再丑、功能再烂那也是一种成就! 实现录音、录制视频功能需要调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,506
精华内容 602
关键字:

android实现录音