【问题标题】:Android MediaRecorder recording looping back on itselfAndroid MediaRecorder 录制循环回自身
【发布时间】:2017-05-26 05:06:18
【问题描述】:

我制作了一个使用 MediaRecorder 和 MediaPlayer 的应用,但每当我录制和播放某些内容时,它都会自行循环播放。

例如我说,一、二、三、四、五、六、七、八、九、十

但它播放为一、二、三三、四四、五五五等。如果录制时间更长,它会变得更糟?

这可能是一个简单的错误,但我没有看到它。

这是我的代码:

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.CountDownTimer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ProgressBar;
import android.widget.Switch;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {

Switch switchPlay;
Button btnRecord, btnDelete;
ProgressBar pBarMetronome;

MediaRecorder mRecorder1, mRecorder2, mRecorder3, mRecorder4, mRecorder5, mRecorder6;
MediaPlayer mp1, mp2, mp3, mp4, mp5, mp6;

String sdPath = "/sdcard/Looper Recordings/";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    switchPlay = (Switch)findViewById(R.id.switchPlay);
    btnRecord = (Button)findViewById(R.id.buttonRecord);
    btnDelete = (Button)findViewById(R.id.buttonDelete);

    pBarMetronome = (ProgressBar)findViewById(R.id.progressBarMetronome);

    clearFile();
    createFile();
    lineOne();
}

private void playOne(){
    mp1 = new MediaPlayer();
    Uri myUri = Uri.parse("/sdcard/Looper Recordings/one.mp3");
    mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        mp1.setDataSource(getApplicationContext(), myUri);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mp1.prepare();
        Toast.makeText(MainActivity.this, "preparing", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
    }

    mp1.start();
    Toast.makeText(MainActivity.this, "play!", Toast.LENGTH_SHORT).show();
}

private void recordOne(){
    mRecorder1 = new MediaRecorder();
    mRecorder1.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder1.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mRecorder1.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mRecorder1.setOutputFile(sdPath+"one.mp3");
    //mRecorder1.setAudioEncoder(MediaRecorder.getAudioSourceMax());
    mRecorder1.setAudioEncodingBitRate(16);
    mRecorder1.setAudioSamplingRate(44100);
    try {
        mRecorder1.prepare();
        Toast.makeText(MainActivity.this, "preparing...", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
    }
            Toast.makeText(MainActivity.this, "starting...", Toast.LENGTH_SHORT).show();
            mRecorder1.start();

            new CountDownTimer(5000,1000){
                @Override
                public void onTick(long millisUntilFinished) {

                }

                @Override
                public void onFinish() {
                    mRecorder1.stop();
                    Toast.makeText(MainActivity.this, "Stopped!", Toast.LENGTH_SHORT).show();
                }
            }.start();
}

private void lineOne(){
    btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            recordOne();

        }
    });
    btnRecord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            new CountDownTimer(4000,1000){
                @Override
                public void onTick(long millisUntilFinished) {
                    btnRecord.setText(""+(millisUntilFinished/1000));
                    playOne();
                }

                @Override
                public void onFinish() {

                }
            }.start();

        }
    });
    switchPlay.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked){
                //ON



            }else{
                //OFF


            }
        }
    });
}

private void clearFile(){
    File dir = new File(Environment.getExternalStorageDirectory()+"/sdcard/Looper Recordings");
    if (dir.isDirectory())
    {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++)
        {
            new File(dir, children[i]).delete();
        }
    }
}

private void createFile(){
    File recordingDirectory = new File(Environment.getExternalStorageDirectory()+ File.separator+"Looper Recordings");

    if(!recordingDirectory.exists() && !recordingDirectory.isDirectory())
    {
        // create empty directory
        if (recordingDirectory.mkdirs())
        {
            Toast.makeText(MainActivity.this, "Folder for recordings created!", Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(MainActivity.this, "Folder for recordings could not be created?", Toast.LENGTH_SHORT).show();
        }
    }
    else
    {
    }
}
}

我知道这很混乱,但我仍在制作原型

感谢任何愿意提供帮助的人!

【问题讨论】:

    标签: android media-player mediarecorder


    【解决方案1】:

    您似乎正在多次初始化 MediaPlayer 并同时播放它们

    【讨论】:

    • 我在哪里做的?
    • 每次在方法的第一行调用playOne
    • 谢谢!我想我明白你的意思了!我将 playOne 放在 onTick() 而不是 onFinish() 中。感谢您的帮助!
    【解决方案2】:

    您是否尝试将循环设置为 false。

    private void playOne(){
    if(mp1 != null && mp1.isPlaying()){
    {
        mp1.stop();
    }
    mp1 = new MediaPlayer();
    mp1.setLooping(false);
    Uri myUri = Uri.parse("/sdcard/Looper Recordings/one.mp3");
    mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        mp1.setDataSource(getApplicationContext(), myUri);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mp1.prepare();
        Toast.makeText(MainActivity.this, "preparing", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    mp1.start();
    Toast.makeText(MainActivity.this, "play!", Toast.LENGTH_SHORT).show();
    }
    

    【讨论】:

    • 谢谢!我试过了,但它仍然有同样的问题:(
    • 你在初始化之前尝试停止它吗?
    • 我想通了!也感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多