当前位置: 代码迷 >> 综合 >> Android audio 四 AudioTrack 分析上
  详细解决方案

Android audio 四 AudioTrack 分析上

热度:53   发布时间:2023-12-29 09:22:34.0

Android audio 一 源码路径

Android audio 二 AudioRecord 分析上

Android audio 三 AudioRecord 分析下

Android audio 四 AudioTrack 分析上

Android audio 五 AudioTrack 分析下

Android audio 六 AudioRecord AudiTrack 拾音放音例子

Android 播放音频类 AudioTrack

文件:

frameworks/base/media/java/android/media/AudioTrack.java

frameworks/base/core/jni/android_media_AudioTrack.cpp

frameworks/av/media/libmedia/AudioTrack.cpp

 

AudioTrack 只能播放 pcm 格式的音频,实现 AudioTrack 播放音频的步骤:

  1. 获取基本参数(如声道,采样率, 音频缓存大小等 )
  2. 根据第一步获取的基本参数,创建AudioTrack对象
  3. 获取PCM文件,写入 AudioTrack
  4. 开始播放
  5. 停止并释放 AudioTrack

例如:

// 第一步 获取基本参数
int bufferSize = 1920;
int rate       = 48000;
// 第二步 根据第一步获取的基本参数,创建AudioTrack对象
private AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,rate,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT,bufferSize,AudioTrack.MODE_STREAM);// 第三步 获取 PCM 文件,写入 AudioTrack
byte[] bytes;
bufferSize = XxxPcmRead(pcm,bytes,bufferSize);// 第四步 开始播放
audioTrack.write(bytes, 0, bytes.length);
audioTrack.play();// 第五步 停止并释放 AudioTrack
audioRecord.stop();
audioRecord.release();
audioRecord = null;

 

从创建 AudioTrack 开始分析:

先来看看 AudioTrack 构造函数:

在创建 AudioTrack 的时候,传入音频流类型, 采样率 ,音频通道数,buffer 长度等参数。

    public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,int bufferSizeInBytes, int mode, int sessionId)throws IllegalArgumentException {// mState already == STATE_UNINITIALIZEDthis((new AudioAttributes.Builder()).setLegacyStreamType(streamType).build(),(new AudioFormat.Builder()).setChannelMask(channelConfig).setEncoding(audioFormat).setSampleRate(sampleRateInHz).build(),bufferSizeInBytes,mode, sessionId);}

 

在看看 write 调用的 audiotrack 内部实现的另一个 write 方法 

    public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes) {return write(audioData, offsetInBytes, sizeInBytes, WRITE_BLOCKING);}

接下来看看 play(), play 调用本地方法 native_start();

    public void play()throws IllegalStateException {if (mState != STATE_INITIALIZED) {throw new IllegalStateException("play() called on uninitialized AudioTrack.");}baseStart();synchronized(mPlayStateLock) {native_start();mPlayState = PLAYSTATE_PLAYING;}}

 

Android 中 AudioTrack 的 java层业务是调用本地 native 层的 c/cpp 代码实现。

同分析 audiorecord 类似, 我们进入 native 找到 AudioTrack 的本地实现  AudioTrack.cpp  。

 

 

 

  相关解决方案