2

600hz で 10 秒のサウンドを再生しようとしていますが、代わりに 600hz を 3 秒以上再生できません。誰かが私が間違っていることを指摘できますか?

    int minBuffersize = AudioTrack.getMinBufferSize(samplerate, 
           AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

    int size= (int) ((10f*samplerate)
            /minBuffersize +1);

            size*=minBuffersize;//round to the nearest minBuffersize multiple so I don't get an error

    short[] play= new short[size];

    for(int i =0;i<play.length;i++){
        float time=(float)i/(float)samplerate;

        play[i]=(short) (((float)Short.MAX_VALUE/10f)*Math.sin(
                600f
                *time
                *(2f*Math.PI)));
    }

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,
            samplerate,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            play.length,
            AudioTrack.MODE_STATIC);


    int result=at.write(play,0,play.length);

    Log.d("!!!", "result: "+result);

    at.play();

デバッグ行が戻る場所

result: 221184

一貫して。

play.length = 442368 であることに注意してください。

さらに実験を重ねた結果、バッファーは常に play.length の半分ですが、バッファーの大きさに関係なく、サウンド自体は 3 ~ 5 秒しか持続しません。

4

3 に答える 3

1

AudioTrackには、バイト単位のバッファサイズが必要です。Shortは2バイトを使用するため、バッファーサイズにはsize*2を使用する必要があります。

于 2012-10-22T19:24:39.777 に答える
1

使用している AudioTrack AudioTrack.MODE_STATIC(低レイテンシ要件の短いサウンドの場合) ではAudioTrack.MODE_STREAM、長いバッファーに適しているため、使用する必要があります (正確にはわかりませんが、おそらく 3 秒以上に関連しています)。

ここを見てください:AudioTrack

コードを次のように変更するだけです。

AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,
        samplerate,
        AudioFormat.CHANNEL_OUT_MONO,
        AudioFormat.ENCODING_PCM_16BIT,
        play.length,
        AudioTrack.MODE_STREAM);

そして、それはうまくいくはずです。

于 2014-02-17T11:10:50.183 に答える
0

再生の長さを AudioTrack バッファ サイズから切り離すことをお勧めします。私の経験では、最小バッファ サイズを使用して、それが完了するまで大きな書き込みブロックをそのままにしておくとうまくいきます。

これに影響を与えている可能性があることに気付いたその他のことは、バッファの半分がいっぱいになるまでオーディオが再生されないことです。AudioTrack 内のバッファーが非常に大きいため、その半分を取得して処理しようとしている可能性があります。

于 2012-10-11T04:43:37.350 に答える