美文网首页Android技术知识
通过AudioTrack播放正弦波纯音

通过AudioTrack播放正弦波纯音

作者: 卡咔喀 | 来源:发表于2017-07-19 10:02 被阅读247次

    通过AudioTrack播放正弦波纯音:

    本文参考自:
    Android 播放指定频率正弦波声音----sichard
    Android左右声道的控制----kqw攻城狮

    生成纯音

    所谓的纯音就是一个正弦波,生成的核心是靠Math.sin()方法产生的字节数组。

    public static byte[] sin(byte[] wave, int waveLen, int length) {
            for (int i = 0; i < length; i++) {
                wave[i] = (byte) (HEIGHT * (1 - Math.sin(TWOPI * ((i % waveLen) * 1.00 / waveLen))));
            }
            return wave;
        }
    

    创建播放线程

    在将线程的构造方法中首先把AudioTrack初始化:

    public PlayThread(int rate) {
            if (rate > 0) {
                Hz = rate;
                waveLen = RATE / Hz;
                length = waveLen * Hz;
                wave = new byte[RATE];
                mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, RATE,
                        AudioFormat.CHANNEL_CONFIGURATION_STEREO, // CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_8BIT, length, AudioTrack.MODE_STREAM);
                ISPLAYSOUND = true;
                wave = SinWave.sin(wave, waveLen, length);
            } else {
                return;
            }
        }
    

    这里的ISPLAYSOUND是控制纯音持续播放的关键,否则后面也会讲到。

    之后在线程开始后首先让AudioTrack进入播放的状态,再向AudioTrack写入播放数据:

    @Override
        public void run() {
            super.run();
            if (null != mAudioTrack)
                mAudioTrack.play();
            //一直播放
            while (ISPLAYSOUND) {
                mAudioTrack.write(wave, 0, length);
            }
        }
    

    利用上面的ISPLAYSOUND的参数,将播放循环下去,想要停止播放就将ISPLAYSOUND设为false

    END

    写的比较简单,具体可以参考源码:
    https://github.com/xiaoniu/PureTone

    相关文章

      网友评论

        本文标题: 通过AudioTrack播放正弦波纯音

        本文链接:https://www.haomeiwen.com/subject/pmbwhxtx.html