Android如何从媒体播放器录制音乐

时间:2012-03-07 11:34:02

标签: android android-mediaplayer android-mediarecorder

我正在开发一个项目,我正在使用Android内置媒体播放器播放音乐。我想要实现的目的是能够将流数据保存在SD卡上的文件中。我试图在媒体录制器中使用android build来做到这一点,但是它记录了手机周围的一切,而不仅仅是来自媒体播放器的声音。

所以我的问题是实现这个目标的最佳途径是什么?

这是我已经测试过的一个例子,但之后我无法播放mp3文件,看看是否一切正常:

Log.e("URL AGAIN","url : "+url);
            try {
                if(!isrecording){

                    URL urlStream = new URL(url);
                    InputStream inputStream = urlStream.openStream();
                    Log.d("", "urlStream.openStream()");

                    String filename = Environment.getExternalStorageDirectory().getAbsolutePath();
                    filename += "/deliciousradio.mp3";

                    File outputSource= new File(filename);
                    fileOutputStream = new FileOutputStream(outputSource);
                    Log.d("", "FileOutputStream: " + outputSource);

                    int bytesRead = -1;
                    isrecording = true;

                    byte[] buffer = new byte[30 * 1024];
                    while ((bytesRead = inputStream.read(buffer)) > 0) {

                        byte[] buffer2 = new byte[bytesRead];
                        fileOutputStream.write(buffer2);

                        Log.d("","bytes size :"+buffer2.length);
                        Log.d("","bytesRead : "+bytesRead);

                    }


                } else if(isrecording){
                    fileOutputStream.close();
                }
            } catch(Exception e){}

这里的问题是我收到30作为缓冲区2的长度,我不能理解为什么。

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:0)

    Button recstart, recstop,replay;
//onCreate
File f;
    File externalStorage;
    String path = "";
    MediaRecorder recorder;
    Timer time;
    String filename1 = "";
    boolean s = false;
externalStorage = Environment.getExternalStorageDirectory();
        String sdCardPath = externalStorage.getAbsolutePath();
        recorder = new MediaRecorder();
        path = sdCardPath + "/";

recstart.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                String state = android.os.Environment.getExternalStorageState();
                if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
                    try {
                        throw new IOException("SD Card is not mounted.  It is "
                                + state + ".");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                Date dt = new Date();
                int hours = dt.getHours();
                int minutes = dt.getMinutes();
                int seconds = dt.getSeconds();
                String curTime = hours + "_" + minutes + "_" + seconds;

                filename1 = "phonecall_at" + curTime + ".mp4";
                if (recorder == null) {
                    recorder = new MediaRecorder();
                }

                f = new File(path, filename1);
                try {
                    s = f.createNewFile();

                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    // Toast.makeText(AudioRecording.this,"hiiiii...."+e1.getMessage(),2000).show();
                    e1.printStackTrace();
                }
                // MediaRecorder.AudioSource.VOICE_CALL +
                // MediaRecorder.AudioSource.MIC
                // recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_UPLINK
                // + MediaRecorder.AudioSource.VOICE_DOWNLINK );
                if (s == true) {
                    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

                    recorder.setOutputFile(f.getAbsolutePath());
                    // record.setText("stop");
                    // record.setBackgroundColor( Color.BLUE);
                    // Toast.makeText(AudioRecording.this, String.valueOf(s),
                    // 3000).show();
                    try {
                        recorder.prepare();
                        Toast.makeText(AudioRecording.this, "Recording starts",
                                5000).show();
                    } catch (IllegalStateException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        Log.e(".................................",
                                "" + e.toString());
                    }
                    recorder.start();
                } else {
                    Toast.makeText(getApplicationContext(),
                            "No space Left on device", 2000).show();
                }
                /*
                 * try { recorder.prepare(); Toast.makeText(Recordingvoice
                 * .this,"Recording starts",5000).show(); recorder.start();
                 * 
                 * 
                 * } catch (IllegalStateException e) { // TODO Auto-generated
                 * catch block e.printStackTrace(); } catch (IOException e) { //
                 * TODO Auto-generated catch block // e.printStackTrace(); }
                 */
            }
        });
recstop.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                if (s == true) {
                    Toast.makeText(AudioRecording.this, "Recording stopped",
                            2000).show();
                    if (recorder == null) {
                        recorder = new MediaRecorder();
                    }
                    if (recorder != null) {
                        recorder.stop();
                        recorder.release();
                    }
                    recorder = null;
                    // time.cancel();
                    // uploadCode();
                }

            }
        });
replay.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub

                if (f.exists()) {
                    Toast showMsg = Toast.makeText(getApplicationContext(), "Playing", Toast.LENGTH_SHORT);
                    showMsg.show();
                    String path = f.getAbsolutePath();
                    Uri myUri = Uri.parse(path);
                    MediaPlayer mp = new MediaPlayer();
                    mp.setLooping(false);
                    mp = MediaPlayer.create(AudioRecording.this, myUri);
                    mp.start();
                }
            }
        });