Audroid AudioTrack音频播放

2019-08-20  本文已影响0人  懒烂蓝

1、简介

Android 中用于播放音频的API有三种,分别是:MediaPlayer,SoundPool,AudioTrack。MediaPlayer适合长时间在后台播放媒体音乐,包括本地音乐或在线流媒体资源。SoundPool适合播放比较短的音频片段,比如游戏音效、铃声片段等,它可以同时播放多个音频。AudioTrack更接近底层,它提供了强大的音频控制能力,支持低延迟播放,适合流媒体播放等。AudioTrack播放的音频必须是解码后的PCM数据。

2、MediaPlayer的创建

public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,
            int bufferSizeInBytes, int mode)

3、音频播放

AudioTrack创建完成后,就可以在一个新的线程中,调用以下方法将数据写入到缓存区进行播放
AudioTrack.write(byte[] audioData, int offsetInBytes, int sizeInBytes)
AudioTrack.write方法需要在子线程中调用。

4、代码示例

    private static final int DEFAULT_STREAM_TYPE = AudioManager.STREAM_MUSIC;
    private static final int DEFAULT_PLAY_MODE = AudioTrack.MODE_STREAM;
    private static final int DEFAULT_CHANNEL = AudioFormat.CHANNEL_OUT_MONO;

    /**
     * 缓存的音频大小
     */
    private int mBufferSize;


    private boolean isPlaying = false;

    private AudioTrack audioTrack;
   /**
     * @param sampleRate sample rate、采样率
     * @param encoding   Audio data format、音频格式
     */
    AudioPlayer(int sampleRate, int encoding) {
        this.mSampleRate = sampleRate;
        this.mBufferSize = AudioTrack.getMinBufferSize(sampleRate, DEFAULT_CHANNEL, encoding);

        if (mBufferSize == AudioTrack.ERROR_BAD_VALUE) {
            Log.e(TAG, "获取BufferSize失败");
            return;
        }

        this.audioTrack = new AudioTrack(DEFAULT_STREAM_TYPE, sampleRate, DEFAULT_CHANNEL, encoding, mBufferSize, DEFAULT_PLAY_MODE);

        isPlaying = false;
    }

    /**
     * 播放音频
     *
     * @param audioData
     */
    public void startPlay(final byte[] audioData) {
        if (isPlaying) {
            return;
        }
        if (audioData.length < mBufferSize) {
            Log.e(TAG, "startPlay: 录音太短");
            return;
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                if (audioTrack.write(audioData, 0, audioData.length) != audioData.length) {
                    Log.e(TAG, "startPlay: 播放出错");
                }
                audioTrack.play();
            }
        }).start();
    }

     /**
     * 停止播放
     */
    public void stopPlay() {
        if (!isPlaying) {
            return;
        }
        if (audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
            audioTrack.stop();
        }
        audioTrack.release();
        isPlaying = false;
    }

这里只是介绍了使用AudioTrack进行音频的播放,示例代码只是部分代码。在这里记录一下自己学习的过程。

上一篇下一篇

猜你喜欢

热点阅读