Android audio 四 AudioTrack 分析上

12 篇文章 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_UNINITIALIZED
        this((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  。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值