繁体   English   中英

如何录制蓝牙耳机的音频?

[英]How to record bluetooth headset audio?

我想从蓝牙耳机录制音频。 我对此进行搜索,并在此站点中找到有关该资源的信息。 例如; 如何使用蓝牙耳机 Android MediaRecorder 录制声音到蓝牙 上的AudioTrack,录制和播放 文本到语音

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();
        }
   }
}

但是程序使用内置麦克风。 如何使用蓝牙耳机音频?

谢谢。

根据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);
    }

单击此处以获取完整的源代码。

要从蓝牙录音,您必须在录音开始时将默认的手机麦克风更改为耳机麦克风,这可以通过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();

}

对于全班,请转到此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM