美文网首页
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 发出自定义(频率,持续时间)的声音

    开始只是想发出 be! be!的声音,使用ToneGenerator就可以满足 后面发现不可以设定频率然后在sta...

  • 01. 音频的基本概念

    音频的基本概念 1. 声音的三要素:频率、振幅、波形 1.1 频率 声波的频率,即声音的音调,一般女生发出声音的...

  • 蜂鸣器驱动程序(STM 32)

    有源蜂鸣器和无源蜂鸣器的区别有源蜂鸣器:内置频率发生电路;通电就能发出声音;声音频率固定;成本较高无源蜂鸣器:内部...

  • 52赫兹的鲸鱼

    人耳能听到的声音的频率范围是20-20000赫兹,一般蓝鲸发出的声音频率为15-20赫兹,所以没有任何同类能...

  • 火星探秘历险记2

    方晓发现这声音有点像音乐的频率,她心想:那么为什么每次都是在我们发出声音之后,它才发出声音呢?难道是什么智能识别器...

  • Android音频采集

    最近项目中需要实现手机采集声音频率实现设备律动的效果,整理了下Android与声音相关的知识。 目的 根据声音振幅...

  • 通过AudioTrack播放正弦波纯音

    通过AudioTrack播放正弦波纯音: 本文参考自:Android 播放指定频率正弦波声音----sichard...

  • 性能优化(五):卡顿分析与布局优化

    Android系统每隔大概16.6ms发出VSYNC信号,触发对UI进行渲染。View的绘制频率60fps是最佳的...

  • Android自定义View

    Android自定义View 参考:从此再有不愁自定义View——Android自定义view详解android ...

  • Rest-Framework之频率组件

    用频率组件是为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 自定义频率类,自定义频率规则 自定...

网友评论

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

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