zoukankan      html  css  js  c++  java
  • [转]Android录音与播放

    本文转自:http://www.2cto.com/kf/201207/144738.html

    Android多媒体框架包含获取和编码多种音频格式的支持,所以你可以轻松地把音频合并到你的应用中.如果设备支持,你可以使用MediaRecorder APIs 进行录音.

    本章向你展示如何写一个应用从设备上的microphone获取音频,然后保存并回放.

    注:Android模拟器不具有录音的能力,但是真实的设备一般都具有此功能.

    执行音频获取
    从设备获取音频比回放音频或视频要复杂一点,但是也还算简单:


    创建一个android.media.MediaRecorder的新实例.
    使用MediaRecorder.setAudioSource()设置音频源,一般要使用MediaRecorder.AudioSource.MIC.
    使用MediaRecorder.setOutputFormat()设置输出文件的格式.
    使用MediaRecorder.setOutputFile()设置输出文件的名字.
    使用MediaRecorder.setAudioEncoder()设置音频编码.
    调用MediaRecorder 实例的MediaRecorder.prepare().
    MediaRecorder.start()开始获取音频.
    调用MediaRecorder.stop().停止.
    当你用完MediaRecorder实例后,调用MediaRecorder.release(),就会立即释放资源.


    示例:录音并回放录音

    下面的例子演示了如何设置,开始以及停止音频获取,以及回放录制的文件.

    [java]
    /*
     * 如果输出文件被写入外部存储,
     * 本应用需要具有写外部存储的权限, 
     * 还要具有录音的权限.这些权限必须
     * 在AndroidManifest.xml 文件中声明,像这样:
     *
     * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     * <uses-permission android:name="android.permission.RECORD_AUDIO" />
     *
     */ 
    package com.android.audiorecordtest; 
     
    import android.app.Activity; 
    import android.widget.LinearLayout; 
    import android.os.Bundle; 
    import android.os.Environment; 
    import android.view.ViewGroup; 
    import android.widget.Button; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.content.Context; 
    import android.util.Log; 
    import android.media.MediaRecorder; 
    import android.media.MediaPlayer; 
     
    import java.io.IOException; 
     
     
    public class AudioRecordTest extends Activity 

        private static final String LOG_TAG = "AudioRecordTest"; 
        private static String mFileName = null; 
       //录音按钮  
        private RecordButton mRecordButton = null; 
        private MediaRecorder mRecorder = null; 
       //回放按钮  
        private PlayButton   mPlayButton = null; 
        private MediaPlayer   mPlayer = null; 
     
       //当录音按钮被click时调用此方法,开始或停止录音  
        private void onRecord(boolean start) { 
            if (start) { 
                startRecording(); 
            } else { 
                stopRecording(); 
            } 
        } 
     
       //当播放按钮被click时调用此方法,开始或停止播放  
        private void onPlay(boolean start) { 
            if (start) { 
                startPlaying(); 
            } else { 
                stopPlaying(); 
            } 
        } 
     
        private void startPlaying() { 
            mPlayer = new MediaPlayer(); 
            try { 
        //设置要播放的文件  
                mPlayer.setDataSource(mFileName); 
                mPlayer.prepare(); 
        //播放之  
                mPlayer.start(); 
            } catch (IOException e) { 
                Log.e(LOG_TAG, "prepare() failed"); 
            } 
        } 
     
        //停止播放  
        private void stopPlaying() { 
            mPlayer.release(); 
            mPlayer = null; 
        } 
     
        private void startRecording() { 
            mRecorder = new MediaRecorder(); 
            //设置音源为Micphone  
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
            //设置封装格式  
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
            mRecorder.setOutputFile(mFileName); 
            //设置编码格式  
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     
            try { 
                mRecorder.prepare(); 
            } catch (IOException e) { 
                Log.e(LOG_TAG, "prepare() failed"); 
            } 
     
            mRecorder.start(); 
        } 
     
        private void stopRecording() { 
            mRecorder.stop(); 
            mRecorder.release(); 
            mRecorder = null; 
        } 
     
        //定义录音按钮  
        class RecordButton extends Button { 
            boolean mStartRecording = true; 
     
            OnClickListener clicker = new OnClickListener() { 
                public void onClick(View v) { 
                    onRecord(mStartRecording); 
                    if (mStartRecording) { 
                        setText("Stop recording"); 
                    } else { 
                        setText("Start recording"); 
                    } 
                    mStartRecording = !mStartRecording; 
                } 
            }; 
     
            public RecordButton(Context ctx) { 
                super(ctx); 
                setText("Start recording"); 
                setOnClickListener(clicker); 
            } 
        } 
     
        //定义播放按钮  
        class PlayButton extends Button { 
            boolean mStartPlaying = true; 
     
            OnClickListener clicker = new OnClickListener() { 
                public void onClick(View v) { 
                    onPlay(mStartPlaying); 
                    if (mStartPlaying) { 
                        setText("Stop playing"); 
                    } else { 
                        setText("Start playing"); 
                    } 
                    mStartPlaying = !mStartPlaying; 
                } 
            }; 
     
            public PlayButton(Context ctx) { 
                super(ctx); 
                setText("Start playing"); 
                setOnClickListener(clicker); 
            } 
        } 
     
        //构造方法  
        public AudioRecordTest() { 
            mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
            mFileName += "/audiorecordtest.3gp"; 
        } 
     
        @Override 
        public void onCreate(Bundle icicle) { 
            super.onCreate(icicle); 
            //构造界面  
            LinearLayout ll = new LinearLayout(this); 
            mRecordButton = new RecordButton(this); 
            ll.addView(mRecordButton, 
                new LinearLayout.LayoutParams( 
                    ViewGroup.LayoutParams.WRAP_CONTENT, 
                    ViewGroup.LayoutParams.WRAP_CONTENT, 
                    0)); 
            mPlayButton = new PlayButton(this); 
            ll.addView(mPlayButton, 
                new LinearLayout.LayoutParams( 
                    ViewGroup.LayoutParams.WRAP_CONTENT, 
                    ViewGroup.LayoutParams.WRAP_CONTENT, 
                    0)); 
            setContentView(ll); 
        } 
     
        @Override 
        public void onPause() { 
            super.onPause(); 
            //Activity暂停时释放录音和播放对象  
            if (mRecorder != null) { 
                mRecorder.release(); 
                mRecorder = null; 
            } www.2cto.com
     
            if (mPlayer != null) { 
                mPlayer.release(); 
                mPlayer = null; 
            } 
        } 


    作者:nkmnkm
  • 相关阅读:
    IOS-自定义返回按钮,保留系统滑动返回
    IOS-static cell 与 dynamic cell 混合使用
    IOS-快速集成检查更新
    IOS-如何优雅地拦截按钮事件(判断是否需要登录)
    IOS-更优雅地使用Static Cell
    Xcode8出现问题总结
    IOS-工程师Mac上的必备软件
    Minimum Sum of Array(map迭代器)
    C++ STL map
    Friends and Cookies(思维)
  • 原文地址:https://www.cnblogs.com/freeliver54/p/2700995.html
Copyright © 2011-2022 走看看