android - 用Android播放任意音

标签 android audio

有什么方法可以使Android发出任意频率的声音(这意味着我不想预先录制声音文件)吗?

我环顾四周,ToneGenerator是我唯一能找到的东西,它甚至很近,但是它似乎只能输出标准DTMF音调。

有任何想法吗?

最佳答案

我最初是在博客上找到this example code的,但其中包含一些错误,这些错误会产生一些可怕的声音。我已经修复了这些错误,并将结果代码发布到了这里。似乎对我来说很好!

public class PlaySound extends Activity {
    // originally from http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html
    // and modified by Steve Pomeroy <steve@staticfree.info>
    private final int duration = 3; // seconds
    private final int sampleRate = 8000;
    private final int numSamples = duration * sampleRate;
    private final double sample[] = new double[numSamples];
    private final double freqOfTone = 440; // hz

    private final byte generatedSnd[] = new byte[2 * numSamples];

    Handler handler = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // Use a new tread as this can take a while
        final Thread thread = new Thread(new Runnable() {
            public void run() {
                genTone();
                handler.post(new Runnable() {

                    public void run() {
                        playSound();
                    }
                });
            }
        });
        thread.start();
    }

    void genTone(){
        // fill out the array
        for (int i = 0; i < numSamples; ++i) {
            sample[i] = Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone));
        }

        // convert to 16 bit pcm sound array
        // assumes the sample buffer is normalised.
        int idx = 0;
        for (final double dVal : sample) {
            // scale to maximum amplitude
            final short val = (short) ((dVal * 32767));
            // in 16 bit wav PCM, first byte is the low order byte
            generatedSnd[idx++] = (byte) (val & 0x00ff);
            generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);

        }
    }

    void playSound(){
        final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
                AudioTrack.MODE_STATIC);
        audioTrack.write(generatedSnd, 0, generatedSnd.length);
        audioTrack.play();
    }
}

关于android - 用Android播放任意音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802726/

相关文章:

android - ICS 外观按钮 : which drawable do I have to choose in ICS SDK?

java - 引入ExecutorService后TextView setText不起作用

c# - 无法在 IGraphBuilder.RenderFile 中使用 COM 异常播放 MP3 文件

ios - 声音在我的模拟器上有效,但在我的设备上无效... SWIFT

android - 带圆圈的简单音乐可视化

java - java中平台无关的声音格式是什么

android - 如何将结果数据从 Broadcast Receiver 发送到 Activity

java - 具有绝对布局的android可回收,具有动态创建的编辑文本,并在新行中自动重复

android - 如果设备同时支持 armeabi-v7a 和 arm64-v8a,是否存在 playstore 服务的情况,或者我只会从两者中获得一个架构 apk

java - 如何制作资源加载器?