美文网首页
Android 发出自定义(频率,持续时间)的声音

Android 发出自定义(频率,持续时间)的声音

作者: Pino | 来源:发表于2020-10-29 09:02 被阅读0次

    开始只是想发出 be! be!的声音,使用ToneGenerator就可以满足

     public ToneGenerator toneGenerator;
        public void playSound() { 
           if (toneGenerator == null) {
              toneGenerator = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
            }
           toneGenerator.startTone(ToneGenerator.TONE_CDMA_ANSWER, 200);
       }
    

    后面发现不可以设定频率
    然后在stackoverflow看到两个库,挺有用的
    传送门1 1.https://github.com/m-abboud/android-tone-player 下面是使用方式

    OneTimeBuzzer buzzer = new OneTimeBuzzer();
    buzzer.setDuration(5);
    
    // volume values are from 0-100
    buzzer.setVolume(50);
    buzzer.setToneFreqInHz(110);
    

    传送门2 https://github.com/karlotoy/perfectTune 使用方式github上有

    然后最后一种是自己写的

    public class AudioTrackManager {
        private Thread mRecordThread;
        AudioTrack mAudioTrack;
        private volatile static AudioTrackManager mInstance;
    
        public static AudioTrackManager getInstance() {
            if (mInstance == null) {
                synchronized (AudioTrackManager.class) {
                    if (mInstance == null) {
                        mInstance = new AudioTrackManager();
                    }
                }
            }
            return mInstance;
        }
    
    
        /**
         * Play beep.
         * @param duration     the duration
         * @param frequency_hz the frequency hz
         */
        public void playBeep(int duration,int frequency_hz) {
            destroyThread();
            // int duration = 5; // duration of sound
            // double freqOfTone = 440; // hz
    
            final int sampleRate = 8000;
            final int numSamples = duration * sampleRate;
            final double samples[] = new double[numSamples];
            final short buffer[] = new short[numSamples];
            for (int i = 0; i < numSamples; ++i) {
                samples[i] = Math.sin(2 * Math.PI * i / (sampleRate / frequency_hz));
                buffer[i] = (short) (samples[i] * Short.MAX_VALUE);
            }
             mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, buffer.length, AudioTrack.MODE_STATIC);
    
            Runnable recordRunnable = new Runnable() {
                @Override
                public void run() {
                    mAudioTrack.write(buffer, 0, buffer.length);
                    mAudioTrack.play();
                }
            };
            mRecordThread= new Thread(recordRunnable);
            mRecordThread.start();
        }
        private void destroyThread() {
            try {
                mAudioTrack.stop();
                mRecordThread.interrupt();
                mAudioTrack=null;
                mRecordThread = null;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                mRecordThread = null;
                mAudioTrack=null;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Android 发出自定义(频率,持续时间)的声音

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