首页 文章

如何录制蓝牙耳机音频?

提问于
浏览
1

我想录制蓝牙耳机的音频 . 我搜索这个,我在这个网站上找到了相关信息 . 例如; How to record sound using bluetooth headset Android MediaRecorder to AudioTrack, Recording and Playback Text-To-Speech over bluetooth

public class MainActivity extends Activity {

   private MediaRecorder myRecorder;
   private MediaPlayer myPlayer;
   private String outputFile = null;
   private Button startBtn;
   private Button stopBtn;
   private Button playBtn;
   private Button stopPlayBtn;
   private TextView text;
   private AudioManager amanager;

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

    amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

    text = (TextView) findViewById(R.id.text1);
      // store it to sd card
      outputFile = Environment.getExternalStorageDirectory().
              getAbsolutePath() + "/javacodegeeksRecording.3gpp";

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

      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);
        }
      });
}
public void start(View view){
       try {
          amanager.setMode(AudioManager.MODE_IN_CALL);
          amanager.startBluetoothSco();
          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 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();
       } 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);
           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();
        }
   }
}

但程序使用内置麦克风 . 我该如何使用蓝牙耳机音频?

谢谢 .

2 回答

  • 0

    根据android引用AudioManager.startBluetoothSco()使用startBluetoothSco()启动音频连接,并使用setSpeakerphoneOn(false)停止android设备扬声器 . 首先通过蓝牙将手机连接到设备 . 这是一个例子 .

    private BroadcastReceiver mBluetoothScoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
            System.out.println("ANDROID Audio SCO state: " + state);
            if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
                /*
                 * Now the connection has been established to the bluetooth device.
                 * Record audio or whatever (on another thread).With AudioRecord you can record with an object created like this:
                 * new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                 * AudioFormat.ENCODING_PCM_16BIT, audioBufferSize);
                 *
                 * After finishing, don't forget to unregister this receiver and
                 * to stop the bluetooth connection with am.stopBluetoothSco();
                 */
            }
        }
    };
    
     @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
        registerReceiver(mBluetoothScoReceiver, intentFilter);
        audioManager = (AudioManager) getApplicationContext().getSystemService(getApplicationContext().AUDIO_SERVICE);
        // Start Bluetooth SCO.
        audioManager.setMode(audioManager.MODE_NORMAL);
        audioManager.setBluetoothScoOn(true);
        audioManager.startBluetoothSco();
        // Stop Speaker.
        audioManager.setSpeakerphoneOn(false);
    
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mBluetoothScoReceiver);
        // Stop Bluetooth SCO.
        audioManager.stopBluetoothSco();
        audioManager.setMode(audioManager.MODE_NORMAL);
        audioManager.setBluetoothScoOn(false);
        // Start Speaker.
        audioManager.setSpeakerphoneOn(true);
    }
    

    现在根据要求启动,停止和播放音频 .

    buttonStartRecording.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Check audio permission
                if (checkPermission()) {
                    AudioSavePathInDevice =
                            Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "AudioRecording.3gp";
                    // Start Media recorder
                    MediaRecorderReady();
                    try {
                        mediaRecorder.prepare();
                        mediaRecorder.start();
                    } catch (IllegalStateException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
                    buttonStartRecording.setEnabled(false);
                    buttonStopRecording.setEnabled(true);
    
                    Toast.makeText(MainActivityOne.this, "Recording started",
                            Toast.LENGTH_LONG).show();
                } else {
                    requestPermission();
                }
    
            }
        });
    
        buttonStopRecording.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
    
                buttonStopRecording.setEnabled(false);
                buttonPlayLastRecordAudio.setEnabled(true);
                buttonStartRecording.setEnabled(true);
                buttonStopPlayingRecording.setEnabled(false);
                // Stop Media recorder
                mediaRecorder.stop();
                Toast.makeText(MainActivityOne.this, "Recording Completed",
                        Toast.LENGTH_LONG).show();
            }
        });
    
        buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) throws IllegalArgumentException,
                    SecurityException, IllegalStateException {
                int selectedId = mRadioGroup.getCheckedRadioButtonId();
                if (selectedId == R.id.radioButton) {
                    isAudioPlayInSameDevice = true;
                } else {
                    isAudioPlayInSameDevice = false;
                }
                // if you want to play audio on your Mobile speaker then set isAudioPlayInSameDevice true
                // and if you want to play audio to connected device then set isAudioPlayInSameDevice false.
                if (isAudioPlayInSameDevice) {
                    audioManager.setMode(audioManager.STREAM_MUSIC);
                    audioManager.setSpeakerphoneOn(true);
                } else {
                    audioManager.setSpeakerphoneOn(false);
                    audioManager.setMode(audioManager.MODE_NORMAL);
                }
                audioManager.setBluetoothScoOn(false);
                audioManager.stopBluetoothSco();
                buttonStopRecording.setEnabled(false);
                buttonStartRecording.setEnabled(false);
                buttonStopPlayingRecording.setEnabled(true);
    
                mediaPlayer = new MediaPlayer();
                try {
                    // Start media player
                    System.out.println("Recorded Audio Path-" + AudioSavePathInDevice);
                    mediaPlayer.setDataSource(AudioSavePathInDevice);
                    if (isAudioPlayInSameDevice) {
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    }
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Toast.makeText(MainActivityOne.this, "Recording Playing",
                        Toast.LENGTH_LONG).show();
            }
        });
    
        buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                buttonStopRecording.setEnabled(false);
                buttonStartRecording.setEnabled(true);
                buttonStopPlayingRecording.setEnabled(false);
                buttonPlayLastRecordAudio.setEnabled(true);
    
                if (mediaPlayer != null) {
                    // Stop Media Player
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    MediaRecorderReady();
                }
            }
        });
    
        public void MediaRecorderReady() {
            mediaRecorder = new MediaRecorder();
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
            mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
            mediaRecorder.setOutputFile(AudioSavePathInDevice);
        }
    

    Click here to get the full source code.

  • 5

    要从蓝牙录制,您必须在录制开始时将默认手机麦克风更改为耳机麦克风,这可以通过BluetoothSCO()完成 .

    private static void startBluetoothRecording(
            final OnBluetoothRecording BluetoothRecording,
            final boolean resume, Context context) {
        // TODO Auto-generated method stub
    
        final int MAX_ATTEPTS_TO_CONNECT = 3;
        final AudioManager audioManager = (AudioManager) context
                .getSystemService(Context.AUDIO_SERVICE);
    
        final CountDownTimer timer = getTimer(BluetoothRecording, audioManager,
                resume);
    
        context.registerReceiver(new BroadcastReceiver() {
    
            @Override
            public void onReceive(Context context, Intent intent) {
    
                int state = intent.getIntExtra(
                        AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
                if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
                    // cancel Timer
                    timer.cancel();
                    context.unregisterReceiver(this);
    
                    // pass through and true because
                    // recording from bluetooth so set 8000kHz
    
                    BluetoothRecording.onStartRecording(resume, true);
    
                } else if (AudioManager.SCO_AUDIO_STATE_DISCONNECTED == state) {
                    if (count > MAX_ATTEPTS_TO_CONNECT) {
                        context.unregisterReceiver(this);
                        // Stop BluetoothSCO
                        audioManager.stopBluetoothSco();
                        // reset Counter
                        count = 0;
                        // stop timer
                        timer.cancel();
                        // false because still recording not started
                        BluetoothRecording.onStartRecording(resume, false);
                    } else {
                        // Increment Disconnect state Count
                        count++;
    
                    }
                }
    
            }
        }, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));
    
        // Start the timer
        timer.start();
        audioManager.startBluetoothSco();
    
    }
    

    For full class goto this link

相关问题