【问题标题】:recording and saving audio on Android在 Android 上录制和保存音频
【发布时间】:2011-05-07 16:17:26
【问题描述】:

我正在开发一个 android (2.2) 应用程序来录制音频。该代码似乎运行良好,甚至将文件保存在 SD 卡上,但是当我尝试在我的 Mac 上播放音频文件时没有任何反应。几乎就像文件是空的。我尝试将它们保存为 .mp3 和 .wav 但没有运气。我的代码如下:

import java.io.File;
import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Environment;

public class AudioRecorder {

    private MediaRecorder recorder = new MediaRecorder();

    private File outfile = null;

    public AudioRecorder(){}

    public void startRecording(String audioFile) throws IOException {
        String state = android.os.Environment.getExternalStorageState();
        if(!state.equals(android.os.Environment.MEDIA_MOUNTED))  {
            throw new IOException("SD Card is not mounted.  It is " + state + ".");
        }

        // make sure the directory we plan to store the recording in exists
        File directory = new File(path).getParentFile();
        if (!directory.exists() && !directory.mkdirs()) {
            throw new IOException("Path to file could not be created.");
        }
        try{
            File storageDir = new File(Environment
                    .getExternalStorageDirectory(), "/audio/");
            storageDir.mkdir();
            outfile=File.createTempFile(audioFile, ".wav",storageDir);
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            recorder.setOutputFile(outfile.getAbsolutePath());
        }catch(IOException e){
            e.printStackTrace();
        }

        try{
            recorder.prepare();
        }catch(IllegalStateException e){
            e.printStackTrace();
        }

        recorder.start();
        }

    public void stop() throws IOException {
        recorder.stop();
        recorder.release();
        }
}

我的活动:

/**
 * Recording Activity
 */


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import com.seekika.android.app.helpers.AudioRecorder;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;

public class Record extends Activity {

    private static final String TAG="RecordActivity";

    private int SETTINGS=Menu.FIRST;
    private int LOGOUT=Menu.FIRST + 1;
    private int EXIT=Menu.FIRST + 2;

    //components
    private Button mBtnStartRecording;
    private Button mBtnStopRecording;

    private Chronometer mChronometer;


    private String audioFileName="";
    final AudioRecorder recorder = new AudioRecorder();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recordstory);
        initComponents();
    }

    public void initComponents(){
        mChronometer=(Chronometer)findViewById(R.id.chrono);
        mBtnStopRecording=(Button)findViewById(R.id.btn_stop_recording);
        mBtnStopRecording.setEnabled(false);

        mBtnStopRecording.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //stop timer
                stopRecording();
                //stop recording and save audio file to SD card

            }
        });

        mBtnStartRecording=(Button)findViewById(R.id.btn_start_recording);
        mBtnStartRecording.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                startRecording();
                mBtnStartRecording.setEnabled(false);
                mBtnStopRecording.setEnabled(true);
                //start recording audio
                //start timer

            }
        });

    }

    private void startRecording(){
        mChronometer.setBase(SystemClock.elapsedRealtime());
        mChronometer.start();


        try{
            String myRecording="Seekika-" + System.currentTimeMillis();
            Log.i(TAG, "Start Recording");
            recorder.startRecording(myRecording);
        }catch(IOException e){
            Log.e(TAG,"IOException error");
            e.printStackTrace();
        }

    }

    private void stopRecording(){
        mChronometer.stop();

        try{
            recorder.stop();
        }catch(IOException e){
            e.printStackTrace();
        }

    }


}

【问题讨论】:

    标签: android audio record


    【解决方案1】:

    不知道你是否可以使用它,但这对我有用:

    public void recordAudio(String fileName) {
        final MediaRecorder recorder = new MediaRecorder();
        ContentValues values = new ContentValues(3);
        values.put(MediaStore.MediaColumns.TITLE, fileName);
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        recorder.setOutputFile("/sdcard/sound/" + fileName);
        try {
          recorder.prepare();
        } catch (Exception e){
            e.printStackTrace();
        }
    
        final ProgressDialog mProgressDialog = new ProgressDialog(MyActivity.this);
        mProgressDialog.setTitle(R.string.lbl_recording);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mProgressDialog.setButton("Stop recording", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            mProgressDialog.dismiss();
            recorder.stop();
            recorder.release();
            }
        });
    
        mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){
            public void onCancel(DialogInterface p1) {
                recorder.stop();
                recorder.release();
            }
        });
        recorder.start();
        mProgressDialog.show();
    }
    

    【讨论】:

    • 我假设您将文件保存为 .mpeg4?
    • 是的,recorder.setOutputSource(MediaRacorder.Outputformat.MPEG_4);
    • 我认为你的意思是 recorder.setOutputFormat(MediaRacorder.Outputformat.MPEG_4)) :)
    • 记住 manifest.xml 中的“
    • 完美运行。谢谢
    【解决方案2】:
     recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    

    这意味着您要创建(记录)一个 OUTPUTFORMAT 为 RAW_AMR 的文件

    但我想只提供一个文件名为.mp3 的文件路径是不行的。这可能就是问题所在。

    检查创建的项目的详细信息(长按文件并单击详细信息)它会提供有关文件的一些信息,例如 Windows 右键单击​​属性。

    【讨论】:

    • 我们感谢您的帮助,但请不要将您的个人信息放在答案块中,个人资料已经在那里,谢谢
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多