zoukankan      html  css  js  c++  java
  • Android录制声音(一)Recorder

    再看Android SDK的录制声音的例子时看见文章比较短就翻译了一下,请大家提出宝贵意见:

    Android SDK \docs\guide\topics\media\audio-capture.html 的翻译

    音频录制

    Android多媒体框架支持对常见音频的录制和编码,如果硬件支持,可以使用 MediaRecorder APIs 来非常方便的编写音频程序。

    通过学习这篇文档,你可编写应用程序通过设备的麦克来录制声音,并且保持和播放声音。

      注意:Android模拟器不支持录制声音的功能,必须有实际设备。

    运行录制声音程序

       音频的录制要比音频或者视频的播放要复杂,但是相对也比较简单,课遵循以下步骤:

    1.      创建MediaRecorder实例: android.media.MediaRecorder

    2.      设置音频来源:MediaRecorder.setAudioSource();

    3.      设置输出音频格式:MediaRecorder.setOutputFormat();

    4.      设置输出文件名:MediaRecorder.setOutputFile();

    5.      设置输出编码格式:MediaRecorder.setAudioEncorder();

    6.      在开始录制之前调用MediaRecorder.prepare();

    7.      开始录制声音,调用:MediaRecorder.start();

    8.      停止录制声音,调用:MediaRecorder.stop();

    9.      当录制完声音的时候,调用MediaRecorder.release()来释放占用的相关资源

    例子:录制音频并播放

    下面的例子展示了怎样录制并播放声音

    这个APP需要添加两个权限

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />

    /*
    * The application needs to have the permission to write to external storage
    * if the output file is written to the external storage, and also the
    * permission to record audio. These permissions must be set in the
    * application's AndroidManifest.xml file, with something like:
    *
    * <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 classAudioRecordTestextendsActivity
    {
       
    private staticfinalString LOG_TAG="AudioRecordTest";
       
    private staticString mFileName=null;

       
    private RecordButton mRecordButton=null;
       
    private MediaRecorder mRecorder=null;

       
    private PlayButton   mPlayButton=null;
       
    private MediaPlayer   mPlayer=null;

       
    private void onRecord(boolean start){
           
    if (start){
                startRecording
    ();
           
    } else{
                stopRecording
    ();
           
    }
       
    }

       
    private void onPlay(boolean start){
           
    if (start){
                startPlaying
    ();
           
    } else{
                stopPlaying
    ();
           
    }
       
    }

       
    private void startPlaying(){
            mPlayer
    = newMediaPlayer();
           
    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
    = newMediaRecorder();
            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 RecordButtonextendsButton{
           
    boolean mStartRecording=true;

           
    OnClickListener clicker=newOnClickListener(){
               
    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 PlayButtonextendsButton{
           
    boolean mStartPlaying = true;

           
    OnClickListener clicker=newOnClickListener(){
               
    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 = newLinearLayout(this);
            mRecordButton
    = new RecordButton(this);
            ll
    .addView(mRecordButton,
               
    new LinearLayout.LayoutParams(
                   
    ViewGroup.LayoutParams.WRAP_CONTENT,
                   
    ViewGroup.LayoutParams.WRAP_CONTENT,
                   
    0));
            mPlayButton
    = newPlayButton(this);
            ll
    .addView(mPlayButton,
               
    new LinearLayout.LayoutParams(
                   
    ViewGroup.LayoutParams.WRAP_CONTENT,
                   
    ViewGroup.LayoutParams.WRAP_CONTENT,
                   
    0));
            setContentView
    (ll);
       
    }

       
    @Override
       
    public void onPause(){
           
    super.onPause();
           
    if (mRecorder!=null){
                mRecorder
    .release();
                mRecorder
    = null;
           
    }

           
    if (mPlayer!=null){
                mPlayer
    .release();
                mPlayer
    = null;
           
    }
       
    }
    }

    这是SDK的中带的代码,我已经在自己的手机上成功运行没有任何错误!

  • 相关阅读:
    转储文件知多少
    [原]你知道怎么使用DebugView查看内核调试信息吗?
    [原]排错实战——通过对比分析sysinternals事件修复程序功能异常
    [原]排错实战——VS清空最近打开的工程记录
    [原]排错实战——使用process explorer替换任务管理器
    [原]排错实战——解救加载调试符号失败的IDA
    [原]调试实战——使用windbg调试DLL卸载时的死锁
    [原]调试实战——使用windbg调试TerminateThread导致的死锁
    [原]使用64位的编译工具进行编译
    [原]C++新标准之std::ratio
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300674.html
Copyright © 2011-2022 走看看