声音池未正确加载文件

时间:2014-08-11 15:39:42

标签: android soundpool android-mediarecorder

我的soundpool没有从sdcard正确加载其文件。我从logcat了解到这一点。在这里我也在写我的logcat。 它正确录制我的声音,文件也保存在SD卡中。但是soundpool没有启动/加载它。  它在logcat中不断显示此错误消息。

 LOGCAT : 
   08-13 00:20:30.076: V/AudioTrack(1726): Underrun user: 0, server: 0, flags 0013
08-13 00:20:31.488: V/AudioTrack(1726): Underrun user: 0, server: 0, flags 0013
08-13 00:20:32.309: V/AudioTrack(1726): Underrun user: 0, server: 0, flags 0013
08-13 00:20:32.809: V/AudioTrack(1726): Underrun user: 0, server: 0, flags 0013


        package com.javacodegeeks.android.audiocapturetest;

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

        import android.media.AudioManager;
        import android.media.MediaPlayer;
        import android.media.MediaRecorder;
        import android.media.SoundPool;
        import android.net.Uri;
        import android.os.Bundle;
        import android.os.Environment;
        import android.provider.MediaStore;
        import android.app.Activity;
        import android.content.ContentResolver;
        import android.content.ContentValues;
        import android.content.Intent;
        import android.util.Log;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.widget.AdapterView;
        import android.widget.ArrayAdapter;
        import android.widget.Button;
        import android.widget.Spinner;
        import android.widget.TextView;
        import android.widget.Toast;

        public class MainActivity extends Activity {

           private MediaRecorder myRecorder;
           private MediaPlayer myPlayer;
           private File outputFile = null;
           private String outFile = null;
           private Button startBtn;
           private Button stopBtn;
           private Button playBtn;
           private Button stopPlayBtn;
           private Spinner sp;
           private TextView text;
           public SoundPool spl;
           public int explosion = 0;
           private Button playMod;
           private Uri newUri;
           private static final String TAG = "SoundRecordingActivity";
           String [] singers = {"Atif Aslam" , "Arijit Singh" , "Shreya Goshal"};

           public MainActivity() {
               outFile = Environment.getExternalStorageDirectory().getAbsolutePath();
               outFile += "/audiorecordtest.m4a";
           }
           @Override
           protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);

              text = (TextView) findViewById(R.id.text1);
              sp = (Spinner)findViewById(R.id.spinner1);

              ArrayAdapter<String> adp=new ArrayAdapter<String>(this,
                   android.R.layout.simple_dropdown_item_1line,singers);

                   adp.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
                   sp.setAdapter(adp);
              // store it to sd card
             //outFile = Environment.getExternalStorageDirectory().
                //    getAbsolutePath() + "/AudioRecord.3gpp";

             File sampleDir = Environment.getExternalStorageDirectory();
              try {
                  outputFile = File.createTempFile("sound", ".m4a", sampleDir);
              } catch (IOException e) {
                  Toast.makeText(this, "No Memory Card Inserted", Toast.LENGTH_LONG).show();
                  Log.e(TAG, "sdcard access error");
                  return;
              }


              myRecorder = new MediaRecorder();
              myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
              myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
              myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
              myRecorder.setOutputFile(outputFile.getAbsolutePath());

              startBtn = (Button)findViewById(R.id.start);
              startBtn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    start(v);
                }
              });

              stopBtn = (Button)findViewById(R.id.stop);
              stopBtn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    stop(v);
                }
              });

              playBtn = (Button)findViewById(R.id.play);
              playBtn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                        play(v);    
                }
              });

              stopPlayBtn = (Button)findViewById(R.id.stopPlay);
              stopPlayBtn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    stopPlay(v);
                }
              });

              playMod = (Button)findViewById(R.id.button1);
              playMod.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                playModified(v);    
                }


              });
           }

           public void start(View view){
               try {
                  myRecorder.prepare();
                  myRecorder.start();
               } catch (IllegalStateException e) {
                  // start:it is called before prepare()
                  // prepare: it is called after start() or before setOutputFormat() 
                  e.printStackTrace();
               } catch (IOException e) {
                   // prepare() fails
                   e.printStackTrace();
                }

               text.setText("Recording Point: Recording");
               startBtn.setEnabled(false);
               stopBtn.setEnabled(true);

               Toast.makeText(getApplicationContext(), "Start recording...", 
                       Toast.LENGTH_SHORT).show();
           }

           public void playModified(View v)
           {
                int minBufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
              if(minBufferSize > 0)
              {
                  mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                           AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);

                                    mAudioTrack.setPlaybackRate(22050);

                                    mAudioTrack.play();
              }
              else
              {
                  Toast.makeText(this , "Invalid Sample Rate" , Toast.LENGTH_LONG).show();

              }

              String sing = sp.getSelectedItem().toString();
              if(explosion != 0 )
              {
                  if(sing == "Atif Aslam")
                      {
                        Toast.makeText(this, "Atif Aslam", Toast.LENGTH_LONG).show();
                        spl.play(explosion, 0.98F, 0.98F, 1, 0, 1.3F);
                      }
                  else if(sing == "Arijit Singh")
                      {
                        Toast.makeText(this, "Arijit singh", Toast.LENGTH_LONG).show();
                        spl.play(explosion, 0.3F, 0.3F, 0, 0, 2.0F);
                      }
                  else if(sing == "Shreya Goshal")
                      {
                        Toast.makeText(this, "Shreya", Toast.LENGTH_LONG).show();
                        spl.play(explosion, 0.8F, 0.8F, 0, 0, 0.6F);

                      }
                  else 
                  {
                      Toast.makeText(this, "No File Found A", Toast.LENGTH_LONG).show();
                      return;
                  }       
              }
              else 
              {
                  Toast.makeText(this, "No File Found B",Toast.LENGTH_LONG).show();
                  return;
              }

           }
           protected void addRecordingToMediaLibrary() {
               ContentValues values = new ContentValues(4);
               long current = System.currentTimeMillis();
               values.put(MediaStore.Audio.Media.TITLE, "audio" + outputFile);
               values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));
               values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp");
               values.put(MediaStore.Audio.Media.DATA, outputFile.getAbsolutePath());
               ContentResolver contentResolver = getContentResolver();

               Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
               newUri = contentResolver.insert(base, values);

               sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri));
               Toast.makeText(this, "Added File " + newUri, Toast.LENGTH_LONG).show();
           }


           public void stop(View view){
               try {
                  myRecorder.stop();
                  myRecorder.release();
                  myRecorder  = null;

                  stopBtn.setEnabled(false);
                  playBtn.setEnabled(true);
                  text.setText("Recording Point: Stop recording");

                  Toast.makeText(getApplicationContext(), "Stop recording...",
                          Toast.LENGTH_SHORT).show();
                  /////////////////////////////////////
                 // addRecordingToMediaLibrary();
                 ////////////////////////////////////// 
               } catch (IllegalStateException e) {
                    //  it is called before start()
                    e.printStackTrace();
               } catch (RuntimeException e) {
                    // no valid audio/video data has been received
                    e.printStackTrace();
               }
           }

           public void play(View view) {
               try{
                   myPlayer = new MediaPlayer();
                   myPlayer.setDataSource(outputFile.getAbsolutePath());
                   myPlayer.prepare();
                   myPlayer.start();

                   playBtn.setEnabled(false);
                   stopPlayBtn.setEnabled(true);
                   text.setText("Recording Point: Playing");

                   Toast.makeText(getApplicationContext(), "Start play the recording...", 
                           Toast.LENGTH_SHORT).show();
               } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
           }

           public void stopPlay(View view) {
               try {
                   if (myPlayer != null) {
                       myPlayer.stop();
                       myPlayer.release();
                       myPlayer = null;
                       playBtn.setEnabled(true);
                       stopPlayBtn.setEnabled(false);

                       text.setText("Recording Point: Stop playing");

                       Toast.makeText(getApplicationContext(), "Stop playing the recording...", 
                               Toast.LENGTH_SHORT).show();


                   }
               } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
           }



        }

1 个答案:

答案 0 :(得分:0)

因为我告诉你不要使用soundpool,因为它不支持大文件 所以请使用soundpool之外的其他内容

mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                    channelConfig, format, bufsize, AudioTrack.MODE_STREAM);

            mAudioTrack.setPlaybackRate(sampleRate);

            mAudioTrack.play();

使用上面的snippest,它将指导您使用audiotrack概念来播放录制的文件

其中setPlaybackRate()方法设置播放速率,您可以在其中添加额外费率,或者您可以减去原始速率,然后您的音调将会改变

根据标准音高变化率总是在0.5到2.0之间,其中1.0是原始音高

所以在上面的代码中使用上面的代码,如果你想增加音高那么

mAudioTrack.setPlaybackRate(sampleRate+22050);//here am assuming recording sample rate is 44100

在这种情况下,我添加了22050意味着播放速率将为1.5,因此您的录制文件将以1.5的间距播放,希望它能帮助您快乐编码