ToB企服应用市场:ToB评测及商务社交产业平台

标题: 安卓 获取 喇叭 听筒 音频输出流 AudioPlaybackCapture API 可以捕获音频输 [打印本页]

作者: 络腮胡菲菲    时间: 2024-12-2 22:12
标题: 安卓 获取 喇叭 听筒 音频输出流 AudioPlaybackCapture API 可以捕获音频输
在安卓设备上获取听筒音频流(通常指的是手机的内部音频播放流),可以通过 AudioRecord 类来捕获音频数据。但需要注意的是,获取设备播放的音频流(例如听筒播放的音频)不像获取麦克风音频那样直接。在安卓系统中,没有直接的API来获取设备的输出音频流(比如播放到听筒的音频),因为它通常会受到系统权限和隐私限制。
如果你的目标是捕获手机内部的音频流(例如,应用播放的音频或系统音频),你可能需要使用一些特殊的技能,大概依靠于特定的硬件/驱动程序来实现。
不外,如果你只是想通过 AudioRecord 捕获设备的音频输入(例如麦克风大概其他外部音频输入),我可以提供一个简单的示例。以下是如何使用 AudioRecord 类来获取音频输入流的代码:
示例代码:使用 AudioRecord 捕获音频

  1. import android.media.AudioFormat;
  2. import android.media.AudioRecord;
  3. import android.media.MediaRecorder;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. public class MainActivity extends AppCompatActivity {
  8.     private static final int SAMPLE_RATE_IN_HZ = 44100;  // 采样率
  9.     private static final int BUFFER_SIZE = 2048;  // 缓冲区大小
  10.     private AudioRecord audioRecord;
  11.     private boolean isRecording = false;
  12.     @Override
  13.     protected void onCreate(Bundle savedInstanceState) {
  14.         super.onCreate(savedInstanceState);
  15.         setContentView(R.layout.activity_main);
  16.         // 获取最小缓冲区大小
  17.         int minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
  18.                 AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
  19.         if (minBufferSize == AudioRecord.ERROR_BAD_VALUE) {
  20.             Log.e("AudioRecord", "无效的缓冲区大小");
  21.             return;
  22.         }
  23.         // 创建 AudioRecord 实例
  24.         audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
  25.                 AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
  26.         // 启动一个线程来进行音频录制
  27.         Thread recordingThread = new Thread(new Runnable() {
  28.             @Override
  29.             public void run() {
  30.                 startRecording();
  31.             }
  32.         });
  33.         recordingThread.start();
  34.     }
  35.     private void startRecording() {
  36.         byte[] buffer = new byte[BUFFER_SIZE];
  37.         audioRecord.startRecording();
  38.         isRecording = true;
  39.         while (isRecording) {
  40.             // 从麦克风读取音频数据
  41.             int readResult = audioRecord.read(buffer, 0, buffer.length);
  42.             if (readResult > 0) {
  43.                 // 处理音频数据
  44.                 Log.d("AudioRecord", "读取到音频数据,字节数:" + readResult);
  45.             }
  46.         }
  47.     }
  48.     @Override
  49.     protected void onDestroy() {
  50.         super.onDestroy();
  51.         stopRecording();
  52.     }
  53.     private void stopRecording() {
  54.         if (audioRecord != null && isRecording) {
  55.             isRecording = false;
  56.             audioRecord.stop();
  57.             audioRecord.release();
  58.             audioRecord = null;
  59.             Log.d("AudioRecord", "录音已停止");
  60.         }
  61.     }
  62. }
复制代码
紧张的几点:

使用 AudioPlaybackCapture API(Android 10 及以上)

AudioPlaybackCapture 是 Android 10 引入的一个功能,它答应应用捕获正在播放的音频数据。需要设置符合的权限,并且要在支持该特性的设备上运行。
示例代码:使用 AudioPlaybackCapture

  1. import android.media.AudioPlaybackCaptureConfiguration;
  2. import android.media.MediaPlayer;
  3. import android.media.audiofx.AudioEffect;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. public class MainActivity extends AppCompatActivity {
  8.     private static final String TAG = "AudioCaptureExample";
  9.     @Override
  10.     protected void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.activity_main);
  13.         // 在此处检查设备是否支持 AudioPlaybackCapture
  14.         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
  15.             startAudioCapture();
  16.         }
  17.     }
  18.     private void startAudioCapture() {
  19.         // 设置一个 AudioPlaybackCaptureConfiguration
  20.         AudioPlaybackCaptureConfiguration captureConfig = new AudioPlaybackCaptureConfiguration.Builder()
  21.                 .setCapturePolicy(AudioPlaybackCaptureConfiguration.CAPTURE_POLICY_ALWAYS)
  22.                 .build();
  23.         // 使用 MediaRecorder 来捕获音频输出流
  24.         AudioRecord audioRecord = new AudioRecord.Builder()
  25.                 .setAudioSource(MediaRecorder.AudioSource.DEFAULT)
  26.                 .setAudioFormat(new AudioFormat.Builder()
  27.                         .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
  28.                         .setSampleRate(44100)
  29.                         .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
  30.                         .build())
  31.                 .setBufferSizeInBytes(2048)
  32.                 .setAudioPlaybackCaptureConfiguration(captureConfig)
  33.                 .build();
  34.         // 启动录音
  35.         audioRecord.startRecording();
  36.         Log.d(TAG, "Audio capture started.");
  37.     }
  38. }
复制代码
权限要求:


注意:AudioPlaybackCapture 功能只在 Android 10 及以上版本可用,且需要系统级权限,因此在非 ROOT 设备上可能会受到限制。
总结:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4