【问题标题】:MediaRecorder skipping last few secondsMediaRecorder 跳过最后几秒钟
【发布时间】:2015-07-06 00:20:28
【问题描述】:

我的问题非常简单:我使用MediaRecorder 在用户按下 FAB 时录制语音,然后播放(当他/她释放时)。问题是我在录制结束时失去了几秒钟,我不知道为什么(他们永远不会被播放)。代码(仅显示相关部分):

变量

double record_length = 0;
boolean recording = false;
String outputFile;
Handler myHandler = new Handler();
MediaRecorder recorder = new MediaRecorder();

OnTouchListener

        findViewById(R.id.record_record).setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                findViewById(R.id.delete_swipe).setVisibility(View.VISIBLE);
                StartRecord();
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                if(recording){
                    EndRecord();
                }
                findViewById(R.id.delete_swipe).setVisibility(View.INVISIBLE);

            }
            return true;
        }
    });

.

public void StartRecord() {
    recording = true;
    record_length = 0;
    SharedPreferences saved_login = getSharedPreferences("FalloundLogin", 0);

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);

    //removed construction of outputFile, but it is generated correctly - I checked

    recorder.setOutputFile(outputFile);
    try {
        recorder.prepare();
        recorder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }


    myHandler.postDelayed(UpdateUploadLength, 200);
}

.

public void EndRecord() {
    recording = false;

    try {
        recorder.stop();
        recorder.reset();
        recorder = null;
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }

    MediaPlayer m = new MediaPlayer();

    try {
        m.setDataSource(outputFile);
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        m.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }

    m.start();


}

我需要最长录制时间为 27 秒。为避免复杂化,我在没有这种额外终止条件的情况下进行了测试,并且为了完整起见,我将 Runnable 包括在内。

private Runnable UpdateUploadLength = new Runnable(){
    @Override
    public void run() {
        if(recording == true) {
            record_length += 0.2;
            if (record_length < 27) {
                myHandler.postDelayed(UpdateUploadLength, 200);
            } else {
                //TODO: stop recording
                myHandler.removeCallbacks(UpdateUploadLength);
            }
    }
};

我已经尝试了几个小时但没有运气,因此感谢您提供任何帮助(还有 - 我不知道在同一个帖子中提出多个问题是否不好 - 但有什么方法可以从MediaRecorder?)

提前致谢。

【问题讨论】:

    标签: android android-mediaplayer android-mediarecorder


    【解决方案1】:

    回答你的第二个问题。是的,您可以拥有更好的质量。库中有更多的编码类型、文件格式和参数。示例:

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mediaRecorder.setAudioSamplingRate(44100);
    mediaRecorder.setAudioEncodingBitRate(256000);
    

    此代码会将您的录音机设置为具有 AAC、44.1kHz 采样率和大约 256kbps 的 m4a 文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多